【发布时间】:2013-03-20 10:38:16
【问题描述】:
我正在尝试编写一个 bash 脚本,该脚本将检查不同目录中文件中的五个变量值并相应地更新它们。 由于有五个变量,我想在 for 循环中进行,但我不知道如何比较这些值。 我想要的是伪代码:
var_f=(server_name app_name metadata1 metadata2 metadata) #the variable name in file
var_v=(server1 app /tmp/2 tmp/3 /tmp/config.xml
for i in "${var_f[@]}"
do
if var_f(i)~=var_v(i)
sed -i -e 's/server_name=RANDOM_VAL/server_name=server1/g' server.properties
else
then do nothing
fi
done
我到目前为止的代码:
#!/bin/bash
cd '/home/me/'
set -- $(<server.properties)
echo $server_name # jsut to see if set command is working
sed -i -e 's@server_name=@server_name=server1@g' server.properties
sed -i -e 's@app_name=@app_name=app@g' server.properties
sed -i -e 's@metadata1=@metadata1=/tmp/2@g' server.properties
sed -i -e 's@meatadata2=@metadata2=/tmp/3@g server.properties
sed -i -e 's@metadata=@metadata=/config.xml@g' server.properties
cd '/home/my/test/'
如何运行 var_f 和 var_v 并比较两者? 文件中 var_f 的值可使用 --set 命令获得,但我不知道如何将其与正确值 (var_v) 进行比较。此外, var_v 是正确的值,将使用 for 循环和 if 语句替换错误的值。
任何帮助将不胜感激。 谢谢。
【问题讨论】:
-
不清楚你想要什么。也许你可以分别写出这5个案例;然后我们可以从那里开始重构为一个循环。
-
感谢您的快速评论。对于一种情况,我需要检查值并在需要时进行更新。第一种情况的命令是: 'cd '/home/me'' 'sed -i -e 's/a=RANDOM_VAL/a=server1/g' my.properties' 'cd '/home/test/''将值重写到文件,但是:如果新值是 a=/temp/2/ 则它不起作用。如果可能的话,我想修复它。
-
另外,问题的第二部分是如何将文件中存储的变量值与 var_v 中的变量值进行比较?
-
@shellter 完美!非常感谢,它解决了斜线问题。
-
@Amit:很高兴有帮助,但不清楚您的比较问题,尤其是
for i。你想看看$i 的值是否包含在var_v的任何元素中?也许更具描述性的变量名称将有助于您的数组名称?我认为对于循环中的内部 sed,您需要's@i=.*@a='"${var_f[$i]}"@'。回想一下,在 shell 中,单引号字符可防止 var 扩展,而 dbl-quote 允许 var 扩展,并且您“向上”单个和 dbl-qoted 字符串彼此相邻以创建 1 个字符串(如 cmd 所示,在 shell 扩展 vars 之后)。祝你好运。
标签: arrays bash if-statement for-loop