sed vs array vs variable

时间:2014-06-18 11:58:38

标签: bash loops sed

有一些包含两个数组的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",那么效果很好......

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试一下

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

但它缺少一些分隔符(例如:port_http如果数组名称按此顺序也会更改port_https

答案 1 :(得分:0)

对不起伙计们......

让我们看看sedloop会发生什么:

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

所以 - 需要FIRST $name和FIRST $value,取server.xml.default的内容,在其中查找匹配项(匹配?),替换它,保存到文件{{1} }。好的。

但是在下一个循环中 - 它需要OLD server.xml,寻找SECOND server.xml.default和SECOND $name,并且......同样 - 但是在新$value中它会保存SECOND循环操作,但FIRST循环操作未经修改。

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

server.xml