#!/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
。