String

Jquery 之類的模板,用於在 bash 中格式化字元串

  • June 8, 2015
#!/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不能包含 line END_OF_TEMPLATE

引用自:https://unix.stackexchange.com/questions/208200