3 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用此:
perl -p -i -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < template.txt
${...}用相應(yīng)的環(huán)境變量替換所有字符串(運(yùn)行此腳本之前不要忘記導(dǎo)出它們)。
對(duì)于純bash,這應(yīng)該可以工作(假設(shè)變量不包含$ {...}字符串):
#!/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引用一些引用自身的變量,則該解決方案不會(huì)掛起:
#!/ 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的輸入或保留尾隨換行符數(shù)量的方法。出現(xiàn)最后一個(gè)變體是因?yàn)闅ぁ跋矚g”二進(jìn)制輸入:
read 將解釋反斜杠。
read -r 不會(huì)解釋反斜杠,但如果不以換行符結(jié)尾,仍會(huì)刪除最后一行。
"$(…)"因?yàn)橛斜緦⑷コM可能多的尾隨換行符,所以我最終…與; echo -n a和使用echo -n "${line:0:-1}":此下降的最后一個(gè)字符(這是a)和蜜餞盡可能多的尾隨換行符有一個(gè)在輸入(包括無(wú))。

TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
嘗試 envsubst
FOO=foo
BAR=bar
export FOO BAR
envsubst <<EOF
FOO is $FOO
BAR is $BAR
EOF
- 3 回答
- 0 關(guān)注
- 796 瀏覽
添加回答
舉報(bào)