我有一个项目,需要渲染一个模板。我想提前确保模板中的所有变量都不为空。
我能够通过以下脚本提取具有单行数据的模板,其中仅包含一个变量:
- 模板文件:tmpl_single.tmpl
{
"var1": "${VARIABLE_1}",
"var2": "${VARIABLE_2}",
"var3": "${VARIABLE_3}"
}
- shell脚本文件:generate.sh
#!/bin/bash
DIR_BASE="$(cd "$(dirname "$0")" && pwd)"
render_2_file() {
template_file=$1
out_file=$2
set +u
for env in $(sed -n 's/^[^#].*${\(.*\)}.*/\1/p' $template_file); do
# debug
echo "$env : $(eval echo \$${env})"
if [ -z "$(eval echo \$${env})" ]; then
echo "environment variable '${env}' not set"
missing=true
fi
done
if [ "${missing}" ]; then
echo 'Please check the above variable'
exit 1
fi
eval "cat << EOF
$(cat ${template_file})
EOF" >"$out_file"
set -u
}
main(){
# debug generate
# VARIABLE_1=var1_val
# VARIABLE_2=var1_val
# VARIABLE_3=var1_val
# single var in one line
TMPL_PATH=$DIR_BASE/tmpl_single.tmpl
OUT_FILE=$DIR_BASE/tmpl_single.json
# multi var in one line
# TMPL_PATH=$DIR_BASE/tmpl_multi.tmpl
# OUT_FILE=$DIR_BASE/tmpl_multi.json
echo "check path = $OUT_FILE"
if [ ! -f "$OUT_FILE" ]; then
echo "not found, generating"
render_2_file "$TMPL_PATH" "$OUT_FILE"
if [ $? = 0 ]; then
echo "generate successfully"
fi
else
echo "out file existed, no need to generate"
fi
}
main "$@"
输出结果如下,它可以检测到单行一个变量的情况,此时输出错误,没有生成目标文件
stdout:
not found, generating
VARIABLE_1 :
environment variable 'VARIABLE_1' not set
VARIABLE_2 :
environment variable 'VARIABLE_2' not set
VARIABLE_3 :
environment variable 'VARIABLE_3' not set
Please check the above variable
但是,如果模板文件中的一行包含多个变量,则只能提取该行中的最后一个变量。
- 模板文件:tmpl_multi.tmpl
{
"var12": "test1_${VARIABLE_1}:test2_${VARIABLE_2}",
"var3": "test3_${VARIABLE_3}"
}
- 标准输出:
not found, generating
VARIABLE_2 :
environment variable 'VARIABLE_2' not set
VARIABLE_3 :
environment variable 'VARIABLE_3' not set
Please check the above variable
从上面的输出可以看出,变量VARIABLE_1
没有被提取。
请告诉我如何提取一行数据中${}
Package 的多个变量期待您的回复。
3条答案
按热度按时间mzsu5hc01#
我会谨慎使用
eval
。想象一下,用${PATH+$(rm -rf /*)}
或一个变量检查一个输入文件,这个变量会扩展成一些可疑的东西。然而,如果你想走这条路,
grep
是从行中提取多个匹配的完美选择:但是,由于您的输入似乎已经是有效的JSON,并且解释为变量的“规则”是有限的,我可以让您对jq感兴趣吗?
或
或
ma8fv8wu2#
您可以首先使用
grep -oP
提取变量名并将其保存到bash数组中。然后检查它们是否都存在于文件中。
然后你**
export
**它们,并调用一个像envsubst
这样的程序来处理模板。**注意:**您仍然需要确保添加的内容不会破坏您的JSON。
3qpi33ja3#
使用Bash + TXR:
check.sh
中的代码:Txr
-B
以shell赋值格式输出变量绑定,并进行适当的转义。列表变量变成数组赋值,如VAR[0]=VARIABLE_1
,这将使我们获得Bash数组中的变量。一个改进是删除重复项,因为变量可能在模板中出现不止一次。