感谢这里的anubhava的回答(https://stackoverflow.com/a/32873200/12365630)我们知道,如果数组中有其他元素与其他元素不同,如何在数组中进行搜索,所以我尝试了类似的方法,发现它不起作用。
例如,所有元素都应该是UP,如果一个(或多个(不是,则给出一个消息
$ arr=(UP DOWN UP UP)
$ [[ " ${arr[*]} " == *" "[^U]" "* ]] && echo "array has non-UP element(s)" || echo "no"
no
它应该声明该数组中有一个非UP(第二个,那个DOWN(元素,但它失败了。可能它只匹配字母而不匹配单词。。
该如何处理";[^U]";是为了解决这个问题吗?
如果能更好地理解这一点,有人能详细解释一下吗*" "[^U]" "*
?
为了使此解决方案工作,您必须首先使用命令shopt -s extglob
来启用扩展的globbing:
[[ " ${arr[*]} " == *" "!(@(UP|*" "*))" "* ]] && echo "array has non-UP element(s)" || echo "no"
从本质上讲,这是在每个元素周围放置一个空格,并检查它们是否与glob匹配。${arr[*]}
是数组中由空格连接的每个元素,而" ${arr[*]} "
在数组周围又加了两个空格,所以它最终看起来像" UP DOWN UP UP "
。glob检查字符串是否有任何数量的文本(*
(,后跟一个空格(表示元素的开头(,后跟一些不是!(...)
的内容;UP";或者(@(...|...)
(具有空间的任何东西。