LoginSignup
2
1

More than 5 years have passed since last update.

repeat.sh テンプレートにデータを埋め込んで繰り返す coneta #4

Last updated at Posted at 2018-06-17

repeat.sh

文字列を置換しながら繰り返すbashのスクリプトです。

機能

  • 固定部と可変部からなるテンプレートの可変部をリスト形式のデータで置換する。データが複数ある場合は、区切り文字列を付加しながら置換を繰り返す。結果はstdoutに出力する。
  • ヘッダ文字列とフッタ文字列を結果の前後に出力することも可能。
  • テンプレートの固定部、ヘッダ文字列、フッタ文字列および区切り文字列はprintfコマンドのエスケープシーケンスが使用可能。

使用方法

【呼び出し形式】

__HD__="ヘッダ文字列" __FT__="フッタ文字列" repeat.sh 'テンプレート' '区切り文字列' '被置換文字列のリスト' 'データのリスト#1' 'データのリスト#2' ... 'データのリスト#n'

【パラメータの説明】

パラメータ 内容 備考
環境変数__HD__ ヘッダ文字列 省略可
環境変数__FT__ フッタ文字列 省略可
第1引数 テンプレート文字列
第2引数 区切り文字列
第3引数 被置換文字列のリスト bashのリスト形式、()で囲む
以降の引数 データのリスト bashのリスト形式、()で囲む

【実行例】

__HD__="CREATE TABLE tbl001 (\n" __FT__="\n);\n" repeat.sh '    @1@\t   @2@' ",\n" '(@1@ @2@)' '("i1" "int")' '("i2" "int")' '("vc1" "varchar(80)")' '("vc2" "varchar(80)")'
パラメータ
ヘッダ文字列 __HD__="CREATE TABLE tbl001 (\n"
フッタ文字列 __FT__="\n);\n"
本スクリプト repeat.sh
テンプレート文字列 ' @1@\t @2@'
区切り文字列 ",\n"
被置換文字列のリスト '(@1@ @2@)'
データのリスト '("i1" "int")'
データのリスト '("i2" "int")'
データのリスト '("vc1" "int")'
データのリスト '("vc1" "varchar(80)")'
データのリスト '("vc2" "varchar(80)")'

【実行結果】

CREATE TABLE tbl001 (
    i1     int,
    i2     int,
    vc1    varchar(80),
    vc2    varchar(80)
);

実装

repeat.sh
#/bin/bash
template=$1
delimiter=$2
defs=$3
shift 3
sd=$(echo -n -e '\x04')
eval adefs="${defs}"
for data in "${@}"
do
    adata=("${adata[@]}" "${data}")
done
printf "${__HD__}"
dlmt=""
for a in "${adata[@]}"
do
    line=$({
        printf "sed '"
        eval aa="${a}"
        for ((i=0;i<${#aa[@]};i++))
        do
            printf "s${sd}%s${sd}%s${sd}g\n" "${adefs[i]}" "${aa[i]}"
        done
        printf "' <<< '%s'" "${template}"
    }|bash)
    printf "${dlmt}"
    printf "${line}"
    dlmt=${delimiter}
done
printf "${__FT__}"

環境

ホスト Windows10 COREi7
VM   VirtualBox バージョン 5.2.8 r121009 (Qt5.6.2)
     CentOS Linux release 7.4.1708 (Core)
     3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)
sed (GNU sed) 4.2.2

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1