function contains() { local n=$# local value=${!n} for ((i=1;i < $#;i++)) { if [ "${!i}" == "${value}" ]; then echo "y" return 0 fi } echo "n" return 1 }
A=("one" "two" "three four") if [ $(contains "${A[@]}" "one") == "y" ]; then echo "contains one" fi if [ $(contains "${A[@]}" "three") == "y" ]; then echo "contains three" fi
我不确定这是否是最好的解决方案,但似乎可行。
这种方法的优点是不需要遍历所有元素(至少不是显式地)。但是,由于array_to_string_internal()在array.c中仍然循环遍历数组元素并将它们连接成字符串,因此它可能不比所提出的循环解决方案更有效,但更具可读性。
if [[ " ${array[@]} " =~ " ${value} " ]]; then # whatever you want to do when arr contains value fi
if [[ ! " ${array[@]} " =~ " ${value} " ]]; then # whatever you want to do when arr doesn't contain value fi
请注意,如果要搜索的值是带有空格的数组元素中的单词之一,它将给出假肯定。例如
array=("Jack Brown") value="Jack"
正则表达式将Jack被视为位于数组中,即使它不在。因此,IFS如果您仍想使用此解决方案,则必须更改正则表达式上的分隔符和
IFS=$'\t' array=("Jack Brown\tJack Smith") unset IFS
value="Jack Smith"
if [[ "\t${array[@]}\t" =~ "\t${value}\t" ]]; then echo "yep, it's there" fi
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。