检查一个元素是否存在于Bash数组中

我想知道是否有一个有效的方法来检查在Bash中的数组是否存在一个元素? 我正在寻找类似于我可以在Python中执行的操作,如:

arr = ['a','b','c','d'] if 'd' in arr: do your thing else: do something 

我已经看到使用关联数组bash为Bash 4+的解决scheme,但我想知道是否有另一个解决scheme。

请理解,我知道微不足道的解决scheme是在数组中迭代,但我不想这样做。

你可以这样做:

 if [[ " ${arr[*]} " == *" d "* ]]; then echo "arr contains d" fi 

例如,如果查找“ab”,这会给出误报 – 子string在连接string中,而不是数组元素。 无论您select何种分隔符,都会出现这种困境。

最安全的方法是遍历数组,直到find元素:

 array_contains () { local seeking=$1; shift local in=1 for element; do if [[ $element == $seeking ]]; then in=0 break fi done return $in } arr=(abc "de" fg) array_contains "ab" "${arr[@]}" && echo yes || echo no # no array_contains "de" "${arr[@]}" && echo yes || echo no # yes 

这是一个“更清洁”的版本,你只需传递数组名称,而不是所有的元素

 array_contains2 () { local array="$1[@]" local seeking=$2 local in=1 for element in "${!array}"; do if [[ $element == $seeking ]]; then in=0 break fi done return $in } array_contains2 arr "ab" && echo yes || echo no # no array_contains2 arr "de" && echo yes || echo no # yes 

抛开一些明显的警告,如果你的arrays真的像上面那样,你可以这样做

 if [[ ${arr[*]} =~ d ]] then do your thing else do something fi 

如果数组元素不包含空格,另一个(也许更可读的)解决scheme将是:

 if echo ${arr[@]} | grep -q -w "d"; then echo "is in array" else echo "is not in array" fi 

1)初始化数组arr并添加元素

2)设置variables来searchSEARCH_STRING

3)检查你的数组是否包含元素

 arr=() arr+=('a') arr+=('b') arr+=('c') SEARCH_STRING='b' if [[ " ${arr[*]} " == *"$SEARCH_STRING"* ]]; then echo "YES, your arr contains $SEARCH_STRING" else echo "NO, your arr does not contain $SEARCH_STRING" fi 

在计算时间方面,另一种方式可能比迭代更快。 不确定。 这个想法是将数组转换为一个string,截断它,并获得新数组的大小。

例如,要find'd'的索引:

 arr=(abcd) temp=`echo ${arr[@]}` temp=( ${temp%%d*} ) index=${#temp[@]} 

你可以把它变成一个函数,如:

 get-index() { Item=$1 Array="$2[@]" ArgArray=( ${!Array} ) NewArray=( ${!Array%%${Item}*} ) Index=${#NewArray[@]} [[ ${#ArgArray[@]} == ${#NewArray[@]} ]] && echo -1 || echo $Index } 

你可以打电话给:

 get-index d arr 

它会回显3,这可以分配给:

 index=`get-index d arr` 

FWIW,这是我用的:

 expr "${arr[*]}" : ".*\<$item\>" 

这适用于任何数组项目或search目标中没有分隔符的情况。 我不需要为我的应用程序解决一般情况。

 array=("word" "two words") # let's look for "two words" 

使用grepprintf

 (printf '%s\n' "${array[@]}" | grep -x -q "two words") && <run_your_if_found_command_here> 

for

 (for e in "${array[@]}"; do [[ "$e" == "two words" ]] && exit 0; done; exit 1) && <run_your_if_found_command_here> 

对于not_found结果添加|| <run_your_if_notfound_command_here> || <run_your_if_notfound_command_here>