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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top