Linux
如何過濾ksh中的字元串數組
我想從“aa”數組中刪除“bb”數組中定義的 IP,因此 IP 的255.0.0.0和255.255.255.0將從aa數組的列表中刪除。
當我執行我的 ksh 程式碼並稍後列印數組 aa 時,我看到 IP - 255.255.255.0沒有被刪除?
我的語法有什麼問題?
echo ${aa[*]} 45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12 echo ${bb[*]} 255.0.0.0 255.255.255.0
ksh程序:
for run in ${bb[*]} do for ((i=0; i<${#aa[@]}; i++)); do [[ ${aa[i]} == $run ]] && unset aa[i] done done
測試:
echo ${aa[*]} 45.32.3.5 255.255.255.0 19.23.2.12
注意: 255.255.255.0 應該從上面的列表中刪除。
我不知道為什麼您的程式碼不適用於提供的輸入。它在我的系統上的 ksh 下執行。
但是您的原始程式碼有一個問題:條件部分
i<${#aa[@]}
很脆弱-因為${#aa[@]}
,即數組大小在每個之後遞減unset
-但是以下數組元素不會自動向左移動。對於你的例子45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12
這並沒有什麼不同 - 但它會對 - 說:
45.32.3.5 255.0.0.0 19.23.2.12 255.255.255.0
我針對該問題改進了程式碼(注意循環進入之前的分配)。我還消除了一個內部循環(使用關聯數組),它將執行時間從二次提高到線性:
$ cat x.sh
輸出它:
aa=(45.32.3.5 255.0.0.0 255.255.255.0 19.23.2.12) bb=([255.0.0.0]=1 [255.255.255.0]=1) print Size of input ${#aa[*]} print Size of exclude list ${#bb[*]} n=${#aa[*]} for ((i=0; i<$n; ++i)) do if [[ ${bb[${aa[i]}]} ]] then print Removing element with index $i: ${aa[i]} unset aa[i]; fi print New size of input ${#aa[*]} done print Resulting size of input ${#aa[*]} print Resulting elements ${aa[*]} for ((i=0; i<$n; ++i)) do print Index $i, Value 'a['$i']'=${aa[$i]} done
它在 Fedora 17 上產生以下輸出:
$ ksh x.sh Size of input 4 Size of exclude list 2 New size of input 4 Removing element with index 1: 255.0.0.0 New size of input 3 Removing element with index 2: 255.255.255.0 New size of input 2 New size of input 2 Resulting size of input 2 Resulting elements 45.32.3.5 19.23.2.12 Index 0, Value a[0]=45.32.3.5 Index 1, Value a[1]= Index 2, Value a[2]= Index 3, Value a[3]=19.23.2.12