有沒有方法可以測試一個數組是否包含指定的元素?bash中的數組運算符
例如,像:
array=(one two three)
if [ "one" in ${array} ]; then
...
fi
有沒有方法可以測試一個數組是否包含指定的元素?bash中的數組運算符
例如,像:
array=(one two three)
if [ "one" in ${array} ]; then
...
fi
一個for循環將做的伎倆。
array=(one two three)
for i in "${array[@]}"; do
if [[ "$i" = "one" ]]; then
...
break
fi
done
array="one two three"
if [ $(echo "$array" | grep one | wc -l) -gt 0 ] ;
then echo yes;
fi
如果這是醜陋的,你可以把它隱藏掉的功能。
如果你egrep的單詞邊界,'egrep「\ bone \ b」',你將防止array =「onex two three」匹配'one'。 ''echo「$ array」| egrep「\ bone \ b」&& echo hit || echo miss''就足夠了 - wc-l和-gt0是superflous。 – 2011-05-02 03:55:04
不需要測試('[')。只需使用grep的返回值即可。 – 2011-05-02 13:50:44
,如果你只是想檢查一個元素是否在數組,另一種方法
case "${array[@]/one/}" in
"${array[@]}") echo "not in there";;
*) echo "found ";;
esac
這是否與[此答案](http://stackoverflow.com/a/5853138/2533433)具有相同的問題 - 即在「誠實」上回顯「發現」? 'foo =(誠實的單身); echo「$ {foo [@]/one /}」'給出'hst man',因此將返回「找到」與您的解決方案。 – Izzy 2014-11-07 20:27:37
試試這個:
array=(one two three)
if [[ "${array[*]}" =~ "one" ]]; then
echo "'one' is found"
fi
除非數組是''array =(scone honest)'',它實際上不能被認爲包含'one'元素,但會被'=〜'操作符匹配。 – 2011-05-02 03:49:37
@Jonathan oops,你說得對。我投了[@Frank的回答](http://stackoverflow.com/questions/5852446/in-array-operator-in-bash/5852473#5852473)。 – pepoluan 2011-05-02 04:08:38
沒有真正解決這個問題*一般*,但在許多情況下可能有幫助(至少當每個數組元素只包含一個單詞時):使正則表達式(右站點)'=〜「\ bone \ b」 '只匹配整個單詞。我喜歡簡單! – Izzy 2014-11-06 15:25:06
我得到了我的.bashrc文件的功能「包含」:
contains()
{
param=$1;
shift;
for elem in "[email protected]";
do
[[ "$param" = "$elem" ]] && return 0;
done;
return 1
}
它的工作原理以及使用數組:
contains on $array && echo hit || echo miss
miss
contains one $array && echo hit || echo miss
hit
contains onex $array && echo hit || echo miss
miss
但並不需要一個數組:
contains one four two one zero && echo hit || echo miss
hit
我喜歡用grep此:
if echo ${array[@]} | grep -qw one; then
# "one" is in the array
...
fi
(注意這兩個-q
和-w
是非標準選項給grep:-w
告訴它只處理整個單詞,並且-q
(「安靜」)抑制所有輸出。)
注意這也僅適用於元素是單個單詞(如示例中所示)。用它來檢查'array =(「一個人」,「兩匹馬」)中的元素「one」會錯誤地產生它(因爲「one」是一個單詞*包含*,即第一個元素的一部分) ,儘管它不是(作爲一個獨立的元素)。 – Izzy 2014-11-08 12:01:34
In_array() {
local NEEDLE="$1"
local ELEMENT
shift
for ELEMENT; do
if [ "$ELEMENT" == "$NEEDLE" ]; then
return 0
fi
done
return 1
}
declare -a ARRAY=("elem1" "elem2" "elem3")
if In_array "elem1" "${ARRAY[@]}"; then
...
上面的一個不錯而優雅的版本。
歡迎來到SO Frank。偉大的第一回答。 – John 2011-05-02 18:35:35