我可以使用sed:
替换文件中的占位符(以变量名命名)ID="toto"
SECRET="tata"
sed -i -e "s/\${ID}/$ID/" -e "s/\${SECRET}/$SECRET/" $file
它取代了这个:
$clientId = '${ID}';
$clientSecret = '${SECRET}';
带
$clientId = 'toto';
$clientSecret = 'tata';
我正在尝试通过使用参数的循环来完成这项工作:
ID="toto"
SECRET="tata"
OTHER="franck"
./config.sh $file $ID $SECRET $OTHER
config.sh
for var in "${@:2}"; do
echo "$var" # toto or tata or franck
echo $!{var} # always var whatever I try, would like ID or {SECRET} or ${OTHER}
SETTINGS="$SETTINGS -e "s/\${var}/$var/"" # so this has no effect
done
FILE=$1
sed -i $SETTINGS $FILE
答案 0 :(得分:1)
使用sed
生成要运行的sed
脚本,将数据编辑为一系列sed
命令,然后使用-f /dev/stdin
将脚本提供给{{} 1}}(这可以避免必须清理自己背后的临时文件)。
sed
空备份后缀表示法不适用于BSD(macOS)FILE="$1"
shift
printf '%s\n' "$@" |
sed 's/^\([A-Z][A-Z]*\)=\(.*\)/s%\\${\1}%\2%/' |
sed -i.bak -f /dev/stdin "$FILE"
,因此我将sed
替换为后缀。
这假定调用的格式为:
.bak
必须同时提供名称和值。给定包含以下内容的数据文件file="data"
ID="toto"
SECRET="tata"
OTHER="franck"
./config.sh $file "ID=$ID" "SECRET=$SECRET" "OTHER=$OTHER"
data
输出文件是:
$clientId = '${ID}';
$clientSecret = '${SECRET}';
$publication = '${OTHER}';
生成的脚本格式为:
$clientId = 'toto';
$clientSecret = 'tata';
$pulication = 'franck';
您可以使用任何未使用的字符代替s%\${ID}%toto%
s%\${SECRET}%tata%
s%\${OTHER}%franck%
符号;控制字符如 Control-A 可能非常有效。
答案 1 :(得分:1)
您可以稍微重写config.sh以解决问题:
# grab the output file name
file=$1
shift
# loop through the rest of args which are names of variables that
# need to be substituted
for var in "${@}"; do
# note: ${var} and ${!var} do get evaluated inside single quotes so long as
# there are enclosing double quotes around them
sed_expr=${sed_expr}" -e 's/\${$var}/${!var}/'"
done
# enclose sed_expr as well file in double quotes to prevent
# word splitting and globbig
sed -i "$sed_expr" "$file"
并按如下方式调用它。需要传递变量名称和不其值:
export ID="toto" SECRET="tata" OTHER="franck"
./config.sh file ID SECRET OTHER
或者如果你不想做export
:
ID="toto" SECRET="tata" OTHER="franck" ./config.sh file ID SECRET OTHER
脚本生成的 sed
表达式:
-e 's/${ID}/toto/' -e 's/${SECRET}/tata/' -e 's/${OTHER}/franck/'
上述电话后的文件:
$clientId = 'toto';
$clientSecret = 'tata';
$publication = 'franck';