Ksh

在 KSH 中查找和操作數組元素

  • October 6, 2021

我有一個如下所示的數組:

# echo "${ARRAY[@]}"
1=Napp Slice
4=NNN Issue
3=GG Allow
2=CO-OP
1=Quit

我想遍歷它以查看是否有任何包含該單詞Quit,如果是,則將該元素設置為一個變數。所以我跑到下面:

for x in ${ARRAY[@]}; do
 if [ $x == *Quit* ]; then
   FOO=$x
   echo $FOO
 else
   break
 fi
done

我想返回給我1=Quit ,但是當我執行它時,我得到:

# ./myScript.ksh
1=Napp Slice
4=NNN Issue
3=GG Allow
2=CO-OP
1=Quit

我怎樣才能只取出包含的元素Quit

在發布之前,我真的想看看這個問題是否存在,我對 shell 腳本比較陌生。我確信我缺少一些非常簡單的東西,但我似乎無法理解。

請僅使用 KSH 語法,因為這就是我可以使用的全部內容。

編輯:我仍然需要弄清楚如何刪除找到的元素

謝謝!

當我嘗試使用 執行您的腳本時出現錯誤ksh93,主要是因為==[ ... ]. 我不清楚您使用的是什麼外殼。break只要您不匹配模式,您也會立即執行,這意味著您可能只執行循環的一次迭代。目前尚不清楚輸出數組的內容,但很可能不是您顯示的程式碼。

ksh93在任何情況下,以下腳本都會在shell中執行您想要的操作(bash事實證明,並且zsh):

array=(
       '1=Napp Slice'
       '4=NNN Issue'
       '3=GG Allow'
       '2=CO-OP'
       '1=Quit'
)

for element in "${array[@]}"; do
       if [[ "$element" == *Quit* ]]; then
               foo=$element
               printf '%s\n' "$foo"
               break
       fi
done

注意[[ ... ]]與模式匹配運算符的使用==。此外,請小心引用副檔名,${array[@]}以便單獨引用每個元素,而不是在空格上拆分。

在評論中,您說要從數組中刪除元素。如果您循環遍歷數組的元素,則不能這樣做,但如果您改為遍歷數組的索引,則可以取消設置元素。

for index in "${!array[@]}"; do
       if [[ "${array[index]}" == *Quit* ]]; then
               foo=${array[index]}
               unset -v 'array[index]'
               printf '%s\n' "$foo"
               break
       fi
done

請注意,這可能會在某處為您提供一個“缺少”元素的數組,並且數字索引不再是連續的。


下面的程式碼大致再現了上面第二個程式碼塊的作用,但sh添加了一些額外的功能。在這裡提供它純粹是為了我們自己的娛樂。

#!/bin/sh

set --  '1=Napp Slice'  \
       '4=NNN Issue'   \
       '3=GG Allow'    \
       '2=CO-OP'       \
       '1=Quit'

unset -v found

for element do
       shift
       case $element in (*Quit*) found=$element; continue; esac
       set -- "$@" "$element"
done

printf 'Element = %s\n' "${found-(was not found)}"
printf 'Remaining list:\n'
printf '\t%s\n' "$@"

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