3 回答
TA贡献1784条经验 获得超9个赞
您可以使用此:
perl -p -i -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < template.txt
${...}用相应的环境变量替换所有字符串(运行此脚本之前不要忘记导出它们)。
对于纯bash,这应该可以工作(假设变量不包含$ {...}字符串):
#!/bin/bash
while read -r line ; do
while [[ "$line" =~ (\$\{[a-zA-Z_][a-zA-Z_0-9]*\}) ]] ; do
LHS=${BASH_REMATCH[1]}
RHS="$(eval echo "\"$LHS\"")"
line=${line//$LHS/$RHS}
done
echo "$line"
done
。如果RHS引用一些引用自身的变量,则该解决方案不会挂起:
#!/ bin / bash
line =“ $(cat; echo -na)”
end_offset = $ {#line}
而[[“ $ {line:0:$ end_offset}” =〜(。*)(\ $ \ {([a-zA-Z _] [a-zA-Z_0-9] *)\})(。* )]];做
PRE =“ $ {BASH_REMATCH [1]}”
POST =“ $ {BASH_REMATCH [4]} $ {line:$ end_offset:$ {#line}}”
VARNAME =“ $ {BASH_REMATCH [3]}”
eval'VARVAL =“ $'$ VARNAME'”'
line =“ $ PRE $ VARVAL $ POST”
end_offset = $ {#PRE}
完成
echo -n“ $ {line:0:-1}”
警告:我不知道一种正确处理bash中NUL的输入或保留尾随换行符数量的方法。出现最后一个变体是因为壳“喜欢”二进制输入:
read 将解释反斜杠。
read -r 不会解释反斜杠,但如果不以换行符结尾,仍会删除最后一行。
"$(…)"因为有本将去除尽可能多的尾随换行符,所以我最终…与; echo -n a和使用echo -n "${line:0:-1}":此下降的最后一个字符(这是a)和蜜饯尽可能多的尾随换行符有一个在输入(包括无)。
TA贡献2016条经验 获得超9个赞
尝试 envsubst
FOO=foo
BAR=bar
export FOO BAR
envsubst <<EOF
FOO is $FOO
BAR is $BAR
EOF
添加回答
举报