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
添加回答
舉報