Ksh
在 KSH 中查找和操作數組元素
我有一個如下所示的數組:
# 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' "$@"