Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在脚本执行期间更改配置文件中的某些变量?_Bash_Sed_M4_Awk - Fatal编程技术网

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

Bash 如何在脚本执行期间更改配置文件中的某些变量?,bash,sed,m4,awk,Bash,Sed,M4,Awk,我有一个bash脚本,它以正则间隔开始,并从脚本开头的一个文件中获取大约10个变量。其中一些变量可能在脚本执行期间发生更改,我需要将它们存储在配置文件中。变量位于文件中,并用换行符分隔。例如: $ cat conf var1="cat" var2="dog" var3="hamster" $ 在脚本执行期间更改conf文件中某些变量的最佳实践是什么?我可以使用sed。例如,假设在执行名为var2的脚本变量的过程中,已分配了一个新值fish,即var2=fish。在这种情况下,我可以使用sed

我有一个bash脚本,它以正则间隔开始,并从脚本开头的一个文件中获取大约10个变量。其中一些变量可能在脚本执行期间发生更改,我需要将它们存储在配置文件中。变量位于文件中,并用换行符分隔。例如:

$ cat conf
var1="cat"
var2="dog"
var3="hamster"
$ 
在脚本执行期间更改conf文件中某些变量的最佳实践是什么?我可以使用
sed
。例如,假设在执行名为
var2
的脚本变量的过程中,已分配了一个新值
fish
,即
var2=fish
。在这种情况下,我可以使用
sed
更新
conf
文件:

sed -i "s/var2=\".*\"/var2=\""$var2"\"/" conf
作为下一个选项,我可以在脚本末尾收集所有变量,并用以下内容覆盖文件:

cat > conf << EOF
var1="$var1"
var2="$var2"
var3="$var3"
EOF
awk 使用,它相当简单:

awk -F '=' -v varname="var1" -v varvalue="$var1" '$1 == varname { $2 = "\""varvalue"\"" } { print }' conf
您也可以简单地循环所有变量,使用
-v
选项将它们作为参数提供。脚本将在
=
符号之前查找变量名,并用新值替换映射值的值。如果找不到名称,则不会发生任何事情

请注意,如果变量名包含等于符号,则此操作可能会失败,但这是不允许的,因此没有问题

小心
保存包含双引号的变量时要小心。假设您有
var2=“一些包含“双引号”的文本”
。将其放入您的
conf
文件将是危险的!

如果您要对sed表达式进行双引号引用,并且需要对内部双引号进行斜杠转义,那么至少不要从引号中退出以嵌入变量(即
s/var2=\*\”/var2)=\“$var2\”/“
)。或者,在非变量内容周围使用单引号,并避免转义内部引号(即,
的/var2=“*”/var2=“”““$var2””/”
)。也要引用变量的展开式。无论选择什么选项,都要确保它是原子的。这意味着
sed-i
或其他提供原子就地操作或临时文件和原子
mv
的东西。我会使用。@EtanReisner感谢您对非变量内容技巧的单引号!原子的意思是当我打开
conf
文件进行写入时,没有其他进程可以写入该文件?据我所知,
sed-I
在我的第一篇文章中的例子是一个原子操作?我所说的原子操作是指您需要确保您的进程要么替换整个文件内容,要么根本不修改文件(一次写入文件一行可能会被中断/等等,并丢失数据)。是的,我相信
sed-I
是原子的(正如我在前面的评论中所说的)。感谢这个
awk
示例。然而,它与sed-i相比有什么优势吗?没有。我只是觉得它更容易阅读和理解。如果您想扩展它的功能,那么使用此脚本比使用脚本更容易。您的`选项同样正常,尽管如果变量数量增加,而您可以在awk脚本中使用for循环,您需要大量的行。您不需要
“\”“varvalue”\”“
吗?(但
printf
sprintf
可能更好。)
awk -F '=' -v varname="var1" -v varvalue="$var1" '$1 == varname { $2 = "\""varvalue"\"" } { print }' conf