我想知道是否有一种有效的方法来检查Bash数组中是否存在元素?我正在寻找类似于Python的功能:
arr = ['a','b','c','d']
if 'd' in arr: do your thing else: do something 我见过针对Bash 4+使用针对bash的关联数组的解决方案,但是我想知道是否还有其他解决方案。
请理解,我知道微不足道的解决方案是在数组中进行迭代,但我不希望这样做。 问题来源于stack overflow
您可以这样做:
if [[ " ${arr[*]} " == " d " ]]; then echo "arr contains d" fi 例如,如果您查找“ a b”,这将产生误报-该子字符串在连接的字符串中,但不作为数组元素。无论您选择哪种定界符,都会出现此难题。
最安全的方法是遍历数组直到找到元素:
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 对于关联数组,有测试一个非常整洁的方式,如果该数组包含一个给定的关键:在-v运营商
$ declare -A arr=( [foo]=bar [baz]=qux ) $ [[ -v arr[foo] ]] && echo yes || echo no yes $ [[ -v arr[bar] ]] && echo yes || echo no no 请参见手册中的6.4 Bash条件表达式。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。