Bashで文字列をフォーマットするためのJqueryに似たテンプレート

Bashで文字列をフォーマットするためのJqueryに似たテンプレート
#!/bin/bash
rm all
for f in assets/css/*.css;
do
  printf "<style type='text/css' >\n" >> all
  cat $f >> all
  printf "</style>\n <!-----$f---->" >> all
  echo "$f copied"
done

このコードを使用して、ファイル名を含むすべてのCSSコンテンツをhtmlファイルにコピーします。このコードはうまく動作します。

ただし、文字列の連結方法はテンプレートとロジックを混同します。

次のテンプレート文字列を使用してよりエレガントに作成できますか?

<style type='text/css'>
${cssContent}
</style><!---${cssFileName}--->

そして連想配列(例:

{
  'cssContent' : 'file content',
  'cssFileName' : 'file name'
}

そして関数、

format(templateStr, assocArr)

書式設定された文字列を返しますか?

ベストアンサー1

Bashは明らかに連想配列をサポートしていますが、関数に引数として渡す簡単な方法がないため、使用はお勧めできません。代わりに、このスクリプトは単純な配列にインターリーブされたキーと値のペアを定義し、format()それを序数引数として渡します。

#!/bin/bash

format() (
        T="$1"
        shift
        while test $# -ge 2; do
                eval "$1"'=$(echo "$2")'
                shift 2
        done
        eval "cat <<END_OF_TEMPLATE
$T
END_OF_TEMPLATE"
)

read -r -d '' templateStr <<'EOF'
<style type='text/css'>
${cssContent}
</style><!---${cssFileName}--->
EOF

assocArr=(
  cssFileName "abc.css"
  cssContent  $'.abc {\n  display: none;\n}\n'
)

format "$templateStr" "${assocArr[@]}"

出力:

$ bash format.sh 
<style type='text/css'>
.abc {
  display: none;
}
</style><!---abc.css--->

行を$templateStr含めることはできませんEND_OF_TEMPLATE

おすすめ記事