Expande a variável shell sem globbing

2

Eu quero verificar se uma string de entrada se refere a um nome de arquivo - não uma string curinga como *.txt .

Isso não funciona:

if [ -f "$1" ];

Porque $1 é expandido para *.txt , que é expandido para, digamos, foo.txt bar.txt , que é passado para test -f .

Falta de verificação explícita de caracteres curinga, existe uma maneira geral de executar uma substituição de shell e, em seguida, impedir qualquer globbing?

    
por Steve Bennett 07.08.2014 / 09:41

1 resposta

5

Não, os globs não são expandidos quando são citados, por isso:

set -- '*.txt'
[ -f "$1" ]

Verifica se o arquivo chamado *.txt no diretório atual é um arquivo regular ou um link simbólico para um arquivo normal.

[ -f $1 ]

seria um problema ( $1 passaria por divisão de palavras (aqui não fazendo nada com o valor padrão de $IFS ) e geração de nome de arquivo).

Se você quisesse verificar se havia arquivos regulares com a extensão .txt , você precisaria de um loop ou usar os qualificadores find ou zsh glob.

set -- *.txt
for f do
  if [ -f "$f" ]; then
    echo "there is at least one regular file with a .txt extension here"
  fi
done

Ou se o padrão for encontrado em $1 :

IFS= # disable the globbing part of the split+glob operator
set -- $1
for f do... # as above

zsh :

files=(*.txt(N-.))
echo "$#files regular files with a .txt extension here"

find :

find -L . ! -name . -prune ! -name '.*' -name '*.txt' -type f | grep -q . &&
  echo there are regular .txt files in here
    
por 07.08.2014 / 12:22