como lidar com bash * matching quando não há correspondência?

6

O seguinte snippet funciona bem quando na verdade existem *.txt arquivos no diretório.

for txt in *.txt
do                                               
  echo "loading data from $txt"
done   

Quando não existem, o literal *.txt cai no loop como $ txt (não bom).

Como altero esse código para que, quando não houver arquivos *.txt , o bloco do ... done seja ignorado?

    
por kfmfe04 14.12.2012 / 14:56

2 respostas

8

Parece que o Google teve a resposta para este.

Coloque este encantamento mágico antes da declaração for :

shopt -s nullglob
    
por 14.12.2012 / 15:02
4

A opção nullglob (resposta do @kfmfe04) é melhor se você estiver usando o bash (não uma shell da marca X), e não precisa se preocupar com o nullglob mudar / quebrar qualquer outra coisa. Caso contrário, você pode usar essa opção (um pouco confusa):

for txt in *.txt
do
  [ -e "$txt" ] || continue
  echo "loading data from $txt"
done

Isso silenciosamente ignora arquivos que não existem (principalmente "* .txt" se não houver correspondências, mas possivelmente também arquivos que foram excluídos entre quando o for gerou a lista e quando o loop chegou até eles. .)

    
por 14.12.2012 / 20:51

Tags