Answers:
使用另一种类型的数组:请使用关联数组,而不要使用整数索引数组,因此将要检查的是键(索引)。bash-4.0
或更高版本是必需的。
declare -A array1=(
[prova1]=1 [prova2]=1 [slack64]=1
)
a=slack64
[[ -n "${array1[$a]}" ]] && printf '%s is in array\n' "$a"
在上面我们并不真正在乎这些值,为此它们只需要为非空值即可。您可以通过交换键和值将索引数组“反转”为新的关联数组:
declare -a array1=(
prova1 prova2 slack64
)
declare -A map # required: declare explicit associative array
for key in "${!array1[@]}"; do map[${array1[$key]}]="$key"; done # see below
a=slack64
[[ -n "${map[$a]}" ]] && printf '%s is in array\n' "$a"
如果您有经常搜索的大型数组,那么这样做会有所回报,因为关联数组的实现将比数组遍历循环更好。但是,它不适合每个用例,因为它不能处理重复项(尽管您可以将值用作计数器,而不是上面的1),并且不能处理空索引。
突破上面的复杂行,以解释“反转”:
for key in "${!a[@]}" # expand the array indexes to a list of words
do
map[${a[$key]}]="$key" # exchange the value ${a[$key]} with the index $key
done
与zsh
:
array1=(
prova1
prova2
slack64
)
a=slack64
if ((array1[(Ie)$a])); then
printf '%s\n' "$a in array1"
fi
此函数适用于关联数组。
我们可以使用此功能执行以下操作之一:
-检查数组是否具有特定键-----------------> inArray“ myKey” $ {!myArray [@]}“
-检查数组是否包含特定值---------> inArray“ myValue”“ $ {myArray [@]}”
function inArray # ( keyOrValue, arrayKeysOrValues )
{
local e
for e in "${@:2}"; do
[[ "$e" == "$1" ]] && return 0;
done
return 1
}
declare -A arr
arr[doo]=55
inArray "doo" "${!arr[@]}"
echo $? # 0
inArray "bla" "${!arr[@]}"
echo $? # 1
inArray "55" "${arr[@]}"
echo $? # 0
您也可以使用grep:
array1 =(prova1 prova2 slack64) a =松弛64 if(printf'%s \ n'“ $ {array1 [@]}” | grep -xq $ a);然后 回声“它在” 科幻
$a
,而-
忘记了则不以开头--
)。您可以使用%s\0
代替,%s\n
并使用grep --null
(假设是GNU grep或兼容的),因为bash变量无论如何都不能包含NUL字符。您还需要专门处理空数组的情况(因为该printf命令将打印与具有一个空元素的数组相同的内容)。还要注意,您无需在此处启动子shell。
array1
工作?