数组-如果不是所有元素都相同,则为1行



感谢这里的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";或者(@(...|...)(具有空间的任何东西。

相关内容

最新更新