验证 glob 在 bash 中是否具有唯一的扩展(或者更常见的是在 posix 中)

验证 glob 在 bash 中是否具有唯一的扩展(或者更常见的是在 posix 中)

有没有一种简单但稳定的方法来验证 glob 模式是否具有独特的Bash 中的扩展?

a=$(echo -n somedir-*); [ -z "$a" ] ...

这仅测试某些内容是否被扩展,甚至更多取决于 glob 设置。

答案1

POSIXly(甚至是 Bournely):

set -- somedir-[*] somedir-*
case $#-$1-$2 in
  '2-somedir-[*]-somedir-*') echo 0 match;;
  2-*) echo 1 match;;
  *) echo more than one match;;
esac

somedir-[*] somedir-*是为了消除以下情况的歧义:

  • 没有匹配项(扩展将是somedir-[*] somedir-*
  • 有一个匹配项,但它是一个文字somedir-*(扩展为somedir-* somedir-*.

使用bash,您可以执行以下操作:

(shopt -s nullglob
set -- somedir-*
[ "$#" -eq 1 ])

ksh93zshyash具有相似的功能(该功能来自zsh)但具有不同的语法。

相关内容