Ho pensato che sarebbe stato semplice, ma si sta dimostrando più complesso di quanto mi aspettassi.
Voglio scorrere tutti i file di un determinato tipo in una directory, quindi scrivo questo:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Funziona finché esiste almeno un file corrispondente nella directory. Tuttavia, se non ci sono file corrispondenti, ottengo questo:
current file is *.zip
Ho quindi provato:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Mentre il corpo del ciclo non viene eseguito quando non ci sono file, ricevo un errore da ls:
ls: *.zip: No such file or directory
Come faccio a scrivere un ciclo che non gestisca in modo pulito nessun file corrispondente?
FILES=
ls * .zip ; for fname in "${FILES}"...
ma funziona come previsto confor fname in *.zip ; do....
for file in *.zip
, no `ls ...`
. Il suggerimento di @ cuonglm è in modo che non si *.zip
espanda a nulla quando il modello non corrisponde a nessun file. ls
senza argomenti elenca la directory corrente.
ls
deve generalmente essere evitata: perché non analizzare ls
? ; vedi anche il link nella parte superiore di quella pagina dell'articolo ParsingLs di BashGuide .
shopt -s nullglob
prima di eseguire il ciclo for.