Linux

如何過濾ksh中的字元串數組

  • March 9, 2019

我想從“aa”數組中刪除“bb”數組中定義的 IP,因此 IP 的255.0.0.0255.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

引用自:https://unix.stackexchange.com/questions/80420