ls conditionnel dans un script linux pour la boucle
Question
Je suis en train de créer un simple boucle de for
qui prendra toutes les sorties d'une commande ls
et de mettre chaque sortie dans une variable. Jusqu'à présent, j'ai
for i in ls /home/svn
do
echo $i
done
mais il me donne une erreur.
La solution
Parce que les besoins de ls
à exécuter:
for i in $(ls ...); do
echo $i
done
, vous pouvez également envisager d'englobement du shell à la place:
for i in /home/svn/*; do
echo $i
done
... ou find
, ce qui permet une sélection très fine des propriétés des objets à trouver:
for i in $(find /home/svn -type f); do
echo $i
done
En outre, si vous pouvez avoir un espace blanc dans les segments du chemin ou les noms de fichiers eux-mêmes, utilisez une boucle while (exemple précédent ajusté):
find /home/svn -type f|while read i; do
echo $i
done
while
lit ligne par ligne, de sorte que l'espace blanc est préservé.
En ce qui concerne l'appel de basename
vous avez deux options:
# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}
Pour expliquer la substitution. ##
supprime le plus long modèle avant-anchored de la chaîne, #
jusqu'au premier match de motif, %%
le plus long modèle arrière-anchored et %
le premier match complet en arrière-anchored
Autres conseils
Vous ne pas besoin d'utiliser ls
pour aller sur les fichiers dans ce cas, ce qui suit fera le travail: for i in /home/svn/*; do echo $i; done
Vous souhaitez affecter la sortie de la commande ls i, vous devez l'enfermer dans l'opérateur ou des accents graves $ ():
for i in $(ls /home/svn)
do
echo $i
done
C'est parce que vous le faites mal en premier lieu.
for i in /home/svn/*
do
echo "$i"
done