Frage

Ich versuche eine einfache zu erstellen for Schleife, die alle Ausgänge von einem nimmt ls Befehl und geben Sie jede Ausgabe in eine Variable. Bisher habe ich

for i in ls /home/svn
do
    echo $i
done

Aber es gibt mir einen Fehler.

War es hilfreich?

Lösung

Weil die ls muss ausgeführt werden:

for i in $(ls ...); do
  echo $i
done

Vielleicht möchten Sie stattdessen Shell BILKBing in Betracht ziehen:

for i in /home/svn/*; do
  echo $i
done

... oder find, was eine sehr feinkörnige Auswahl der Eigenschaften von Elementen ermöglicht, um zu finden:

for i in $(find /home/svn -type f); do
  echo $i
done

Wenn Sie in den Segmenten des Pfades oder in den Dateinamen selbst einen weißen Platz haben können, verwenden Sie eine while -Schleife (vorheriges Beispiel angepasst):

find /home/svn -type f|while read i; do
  echo $i
done

while liest sich in Bezug auf die Zeile, so dass der weiße Raum erhalten bleibt.

In Bezug auf die Berufung von basename Sie haben zwei Optionen:

# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}

Um den Substitution zu erklären: ## Entfernt das längste Front-verankerte Muster aus der Saite, # bis zum ersten Muster -Match, %% das am längsten verankerte Muster und % Das erste volle Spiel.

Andere Tipps

Sie müssen nicht verwenden ls Um Dateien in diesem Fall zu übergehen, erledigt Folgendes den Job: for i in /home/svn/*; do echo $i; done

Sie möchten mir die Ausgabe des LS -Befehls zuweisen, daher müssen Sie ihn in Backticks oder den $ () -Operator einschließen:

for i in $(ls /home/svn)
do
    echo $i
done

Das liegt daran, dass Sie es überhaupt falsch machen.

for i in /home/svn/*
do
  echo "$i"
done
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top