类似于 Jquery 的模板,用于在 bash 中格式化字符串

类似于 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)

返回我格式化的字符串?

答案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不能包含 line END_OF_TEMPLATE

相关内容