【问题标题】:Setting Variables Value in a File in Different Directory Using Loops and sed Bash Script使用循环和 sed Bash 脚本在不同目录中的文件中设置变量值
【发布时间】: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


【解决方案1】:

我认为最好在一次 sed 运行中更新所有变量。

#!/bin/bash
var_f=(server_name app_name metadata1 metadata2 metadata) #variable name
var_v=(server1 app /tmp/2 /tmp/3 /tmp/config.xml)
for (( i=0; i < ${#var_f[*]}; ++i ))
do
    substitutions+="s@${var_f[$i]}=\S*@${var_f[$i]}=${var_v[$i]}@;"
done
sed -i "$substitutions" /home/me/server.properties

您是否对每次脚本运行时都要重写文件感到非常困扰?据推测,将当前值与正确值进行比较需要更长的时间。

【讨论】:

    猜你喜欢
    • 2011-10-25
    • 2019-01-05
    • 2021-02-12
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2013-11-15
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多