我想知道是否存在要检查元素是否是在击阵列中存在一个有效的方法? 我在寻找类似的东西,我可以在Python做喜欢的事:
arr = ['a','b','c','d']
if 'd' in arr:
do your thing
else:
do something
我使用的bash为猛砸4+关联数组看到的解决方案,但我想知道是否有另一种解决方案在那里。
请理解,我知道平凡的解决方案是在数组中迭代,但我不希望出现这种情况。
我想知道是否存在要检查元素是否是在击阵列中存在一个有效的方法? 我在寻找类似的东西,我可以在Python做喜欢的事:
arr = ['a','b','c','d']
if 'd' in arr:
do your thing
else:
do something
我使用的bash为猛砸4+关联数组看到的解决方案,但我想知道是否有另一种解决方案在那里。
请理解,我知道平凡的解决方案是在数组中迭代,但我不希望出现这种情况。
你可以这样做:
if [[ " ${arr[*]} " == *" d "* ]]; then
echo "arr contains d"
fi
这将产生假阳性,例如,如果你看“AB” - 这是子中加入的字符串但不是作为一个数组元素。 这种困境将发生无论您选择的分隔符。
最安全的方法是进行循环阵列之上,直到找到元素:
array_contains () {
local seeking=$1; shift
local in=1
for element; do
if [[ $element == $seeking ]]; then
in=0
break
fi
done
return $in
}
arr=(a b c "d e" f g)
array_contains "a b" "${arr[@]}" && echo yes || echo no # no
array_contains "d e" "${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 "a b" && echo yes || echo no # no
array_contains2 arr "d e" && echo yes || echo no # yes
明显的警告放在一边,如果你的数组实际上是像上面的,你可以做
if [[ ${arr[*]} =~ d ]]
then
do your thing
else
do something
fi
1)初始化数组arr
和添加元素
2)设置变量来搜索SEARCH_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
如果数组元素不包含空格,其它的(也许更可读的)的解决办法是:
if echo ${arr[@]} | grep -q -w "d"; then
echo "is in array"
else
echo "is not in array"
fi
这里的另一种方式,可能会更快,在计算时间方面比迭代。 不确定。 我们的想法是数组转换为字符串,截断它,并获得新的数组的大小。
例如,要找到“d”的指标:
arr=(a b c d)
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`
array=("word" "two words") # let's look for "two words"
grep
和printf
: (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>
FWIW,这里我使用了什么:
expr "${arr[*]}" : ".*\<$item\>"
这个工程在没有分隔符在任何阵列项目或搜索目标。 我并不需要解决我的应用程序了一般情况。