【问题标题】:sed vs array vs variablesed vs 数组 vs 变量
【发布时间】:2014-08-08 17:12:39
【问题描述】:

有一些包含两个数组的bash 脚本:

names=( [0]=port_shutdown
        [1]=port_http
        [2]=port_https
        [3]=keystore_file
        [4]=key_alias
        [5]=keystore_pass
        [6]=truststore_file
        [7]=truststore_pass )

value=( [0]="$port_shutdown"
        [1]="$port_http"
        [2]="$port_https"
        [3]="$keystore_file"
        [4]="$key_alias"
        [5]="$keystore_pass"
        [6]="$truststore_file"
        [7]="$truststore_pass" )

还有变量:

port_shutdown="8008"  
port_http="8046"   
port_https="8446"
keystore_file="tomcat.jks"
key_alias="tomcat"
keystore_pass="password"
truststore_file="trustcacerts.jks"
truststore_pass="password"

循环运行:

while [ "$i" -lt "11" ]; do
  name="${names[${i}]}"
  value="${value[${i}]}"
  echo -e "Changing name - "$name" to value "$value";\n"
  sed  's|'"${name}"'|'"${value}"'|g' "server.xml.default" > "server.xml"
  (( i++ ))
done

但它不会改变names...虽然 - 它看到变量中的值:

$ ./config.sh
Changing name - port_shutdown to value "8008";

Changing name - port_http to value 8046;

Changing name - port_https to value 8446;

Changing name - keystore_file to value tomcat.jks;

Changing name - key_alias to value tomcat;

Changing name - keystore_pass to value password;

Changing name - truststore_file to value trustcacerts.jks;

Changing name - truststore_pass to value password;

如果我设置例如 name="port_shutdown"value="8008" - 效果很好...

我在这里做错了什么?

【问题讨论】:

  • 这看起来很尴尬:value="${value[${i}]}"。这将数组value 的第零个字段的值设置为${value[${i}]} 的扩展。当然不是你想要的(但在你的 sn-p 中没有不良影响)。

标签: bash loops sed


【解决方案1】:

试试吧

sed  "s|${name}|${value}|g" "server.xml.default" > "server.xml"

但它是作为分隔符的错误符号(例如:port_http 也将更改 port_https 如果数组名称按此顺序排列)

【讨论】:

  • 是的,它会修复它。感谢您的注意。
【解决方案2】:

对不起各位...

让我们看看sed 在这个loop 中会发生什么:

sed 's|'"${name}"'|'"${value}"'|g' "server.xml.default" > "server.xml"

所以 - 它需要 FIRST $name 和 FIRST $value,获取 server.xml.default 的内容,在其中寻找出现(匹配?),替换它,保存到文件 server.xml。没关系。

但是在下一个循环 - 它需要 OLD server.xml.default,寻找 SECOND $name 和 SECOND $value,并且... 做同样的事情 - 但在新的 server.xml 中它保存了 SECOND 循环动作,但 FIRST 循环动作保持不变。

所以 - 解决方案是创建临时文件,它将在每次循环后保存所有更改:

i=0
cp server.xml.default server.xml.tmp

while [ "$i" -lt "11" ]; do
  name="${names[${i}]}"
  value="${value[${i}]}"
  echo -e "Changing name - "$name" to value "$value";\n"
  sed  's|'"${name}"'|'"${value}"'|g' server.xml.tmp > server.xml
  cp server.xml server.xml.tmp
  (( i++ ))
  name=
  value=
done

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 1970-01-01
    • 2017-08-10
    • 2021-03-01
    • 2010-12-26
    • 1970-01-01
    • 2011-06-21
    • 2021-07-15
    • 2010-11-10
    相关资源
    最近更新 更多