Ls condizionale in uno script Linux per loop
Domanda
Sto cercando di creare un semplice for
Loop che prenderà tutte le uscite di un ls
comanda e metti ogni output in una variabile. Finora l'ho fatto
for i in ls /home/svn
do
echo $i
done
Ma mi dà un errore.
Soluzione
Perché il ls
deve essere eseguito:
for i in $(ls ...); do
echo $i
done
Inoltre, potresti voler considerare invece Shell Globbing:
for i in /home/svn/*; do
echo $i
done
... o find
, che consente una selezione a grana molto fine delle proprietà degli articoli da trovare:
for i in $(find /home/svn -type f); do
echo $i
done
Inoltre, se puoi avere spazio bianco nei segmenti del percorso o dei nomi di file, usa un ciclo while (esempio precedente regolato):
find /home/svn -type f|while read i; do
echo $i
done
while
legge in termini di linea, in modo che lo spazio bianco sia preservato.
Riguardo alla chiamata di basename
Hai due opzioni:
# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}
Per spiegare la sostituzione: ##
Rimuove il modello anteriore più lungo dalla corda, #
Fino alla prima partita di pattern, %%
il modello più lungo ancorato e %
La prima partita completa con il back-ancorato.
Altri suggerimenti
Non hai bisogno di usare ls
Per ripassare i file in questo caso, quanto segue farà il lavoro: for i in /home/svn/*; do echo $i; done
Vuoi assegnare l'output del comando LS a I, quindi devi racchiuderlo nei backtick o nell'operatore $ ():
for i in $(ls /home/svn)
do
echo $i
done
Questo perché stai sbagliando in primo luogo.
for i in /home/svn/*
do
echo "$i"
done