我只是在寻找一种在 Bash 中编写以下代码的更合适且更优雅的方式:
in_array() {
local somearray=${1}[@]
local somevalue=${2}
for i in ${!somearray}; do
if [[ ${i} == ${somevalue} ]]; then
return 0
fi
done
return 1
}
#declare array
declare -a myArray=(foo bar baz qux)
#defined values
val1=foo
val2=baz
#Ugly check if multiple strings are part of the array at the same time
if in_array myArray $val1 && in_array myArray $val2; then
# Do something #
else
# Do something else#
fi
基本思路是我需要检查 2 个或更多静态值是否同时是数组的一部分。想知道是否有更好的方法来实现这一点,因为如果我需要检查超过 3-4 个值...那行代码if in_array
就会变得很长。
请问有什么建议吗?
谢谢你!
答案1
好吧,bash 中的数组操作总是很丑陋,正如您自己将数组传递给函数的方式所显示的那样。
我会将您的测试转换为对分配数组后剩余的参数进行循环:
in_array () {
local somearray=${1}[@]
shift
for SEARCH_VALUE in "$@"; do
FOUND=false
for ARRAY_VALUE in ${!somearray}; do
if [[ $ARRAY_VALUE == $SEARCH_VALUE ]]; then
FOUND=true
break
fi
done
if ! $FOUND; then
return 1
fi
done
return 0
}
因此您可以在一个函数调用中检查所有值是否存在:
arr=(1 2 3 4 5)
in_array arr 1 # 0
in_array arr 1 2 # 0
in_array arr 1 6 # 1
in_array arr 1 2 3 4 5 # 0