有一些包含两个数组的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"
,那么效果很好......
我在这里做错了什么?
答案 0 :(得分:1)
尝试一下
sed "s|${name}|${value}|g" "server.xml.default" > "server.xml"
但它缺少一些分隔符(例如:port_http
如果数组名称按此顺序也会更改port_https
)
答案 1 :(得分:0)
对不起伙计们......
让我们看看sed
中loop
会发生什么:
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