String
Jquery 之類的模板,用於在 bash 中格式化字元串
#!/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)
那返回我格式化的字元串?
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
不能包含 lineEND_OF_TEMPLATE
。