2014-06-18 62 views
0

有一些bash腳本包含兩個數組:的sed VS陣VS可變

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 

但它不」 t change 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

這看起來好不尷尬:'值= 「$ {值[$ {I}]}」'。這將數組「value」的第零個字段的值設置爲「$ {value [$ {i}]}'的擴展。當然不是你想要的(但在你的片段中沒有不需要的效果)。 –

回答

1

嘗試也許

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

但missign東西作爲分隔符(例如:port_http也將改變port_https如果數組名稱是按照這個順序)

+0

是的,它會解決它。謝謝你的提示。 – setevoy

0

對不起球員...

讓我們看看sed發生了什麼loop

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

因此 - 首先需要$name和FIRST $value,需要內容server.xml.default,在其中查找匹配項(匹配?),替換它,保存到文件server.xml。沒關係。

但在下一循環 - 需要OLD server.xml.default,尋找第二$name和第二$value,和...做相同的 - 但在新server.xml保存第二個循環的動作,但第一圈的動作保持不變。

所以 - 解決方案是創建臨時文件,至極將保存每個循環之後所有的變化:

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