Eu pensei que isso seria simples - mas está se mostrando mais complexo do que eu esperava.
Eu quero percorrer todos os arquivos de um tipo específico em um diretório, então escrevo isto:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Isso funciona desde que haja pelo menos um arquivo correspondente no diretório No entanto, se não houver arquivos correspondentes, recebo o seguinte:
current file is *.zip
Eu então tentei:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Enquanto o corpo do loop não é executado quando não há arquivos, recebo um erro de ls:
ls: *.zip: No such file or directory
Como escrevo um loop que não lida corretamente com arquivos correspondentes?
FILES=
ls * .zip, ; for fname in "${FILES}"...
mas funciona como esperado comfor fname in *.zip ; do....
for file in *.zip
, não `ls ...`
. A sugestão do @ cuonglm é *.zip
expandir para nada quando o padrão não corresponder a nenhum arquivo. ls
sem argumentos lista o diretório atual.
ls
geralmente deve ser evitada: Por que não analisar ls
? ; veja também o link no topo da página para o artigo ParsingLs do BashGuide .
shopt -s nullglob
antes de executar o loop for.