Verifique se o glob tem uma expansão única no bash (ou mais geralmente no posix)

6

Existe uma maneira simples, mas estável, de verificar se um padrão glob tem uma expansão exclusiva no Bash?

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

Isso só testa se algo foi expandido ou não, e ainda mais depende das configurações glob.

    
por Harald 08.05.2017 / 13:58

1 resposta

6

POSIXly (até mesmo Bournely):

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

O somedir-[*] somedir-* é para desambiguar os casos em que:

  • Não há correspondência (a expansão seria somedir-[*] somedir-* )
  • Existe uma correspondência, mas é um literal somedir-* (a expansão seria somedir-* somedir-* .

Com bash , você pode fazer:

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

ksh93 , zsh , yash tem um recurso semelhante (o recurso vem de zsh ), mas com uma sintaxe diferente.

    
por 08.05.2017 / 14:06