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

Har*_*ald 5 shell bash wildcards

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

a=$(echo -n somedir-*); [ -z "$a" ] ...
Run Code Online (Sandbox Code Playgroud)

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

Sté*_*las 6

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

(shopt -s nullglob
set -- somedir-*
[ "$#" -eq 1 ])
Run Code Online (Sandbox Code Playgroud)

ksh93, zsh,yash具有类似的功能(该功能来自zsh)但具有不同的语法。