我想知道是否有一个有效的方法来检查一个元素是否存在于数组中的Bash?我正在寻找类似于python的东西,你会写成:
arr = ['a','b','c','d'] if 'd' in arr: do your thing else: do something
我已经见过使用关联数组bash的解决方案Bash 4,但我想知道是否有另一个解决方案。
请理解,我知道一个平凡的解决方案是在数组中迭代,但我不想要。
你可以做:
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