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


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