我有一个bash脚本,它从cron开始,有规律的间隔,来自脚本开头的文件中的大约10个变量。其中一些变量可能在脚本执行期间发生变化,我需要将它们存储在配置文件中。变量位于文件中,并用换行符分隔。例如:
$ cat conf
var1="cat"
var2="dog"
var3="hamster"
$
在执行脚本期间更改conf文件中的某些变量的最佳做法是什么?我可以使用sed
。例如,假设在执行名为var2
的脚本变量时,已分配了一个新值fish
,即var2=fish
。在这种情况下,我可以使用conf
更新sed
文件:
sed -i "s/var2=\".*\"/var2=\""$var2"\"/" conf
作为下一个选项,我可以收集脚本末尾的所有变量并用以下内容覆盖文件:
cat > conf << EOF
var1="$var1"
var2="$var2"
var3="$var3"
EOF
我也查看了m4
,但我无法弄清楚是否可以在我的场景中使用它,因为变量的值在脚本执行期间发生了变化,例如以下显然无法工作:
#!/usr/bin/env bash
. conf
# Initial value of var2 was "dog".
# Now it is replaced with "fish".
var2=fish
m4 -D"$var2"="$var2" conf
答案 0 :(得分:1)
使用awk,这很简单:
+ pyStringLiteralMatches("[ \\t\\r\\n]*(((SELECT|DELETE) .*FROM)|((INSERT|REPLACE) .*INTO)|(UPDATE .* SET)|((CREATE|DROP|ALTER) +(TABLE|INDEX)))[^{}]*")
您也可以简单地遍历所有变量,使用awk -F '=' -v varname="var1" -v varvalue="$var1" '$1 == varname { $2 = "\""varvalue"\"" } { print }' conf
选项将它们作为参数提供。该脚本将在-v
符号前查找变量名称,并用新值替换映射值的值。如果找不到名称,则不会发生任何事情。
请注意,如果变量名称包含等号符号,则可能会失败但不允许这样做,因此没有问题。
注意何时保存包含双引号的变量。假设你有=
。将它放在var2="some text containing "double quotes"'
文件中将是危险的!