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 *.zipespanda a nulla quando il modello non corrisponde a nessun file. lssenza argomenti elenca la directory corrente.
lsdeve generalmente essere evitata: perché non analizzare ls? ; vedi anche il link nella parte superiore di quella pagina dell'articolo ParsingLs di BashGuide .
shopt -s nullglobprima di eseguire il ciclo for.