如何在执行脚本期间更改配置文件中的某些变量?

时间:2015-07-02 16:06:05

标签: bash sed m4

我有一个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

1 个答案:

答案 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"'文件中将是危险的!