2 Stimmen

Wie kann ich eine Liste von Verzeichnissen in einem Array speichern?

Warum wird hier nichts aufgelistet? Danke

FOLDER=()

ls /tmp/backup/ | while read DIR
do
    FOLDER+=("$DIR")
done

echo ${FOLDER[1]}

8voto

Todd A. Jacobs Punkte 75903

Analyse

Ihr Beispiel ist darauf ausgelegt, zu scheitern. Zum Beispiel:

  • Analysieren Sie nicht die Ausgabe von ls.
  • Nehmen Sie nicht an, dass jeder Eintrag in einem Verzeichnis ein Verzeichnis ist.
  • Verketten Sie keine Arrays in einer Schleife ohne triftigen Grund.
  • Verwenden Sie keine unquote Variablen.

Verwenden Sie Shell-Globs

Angenommen, dass jeder Eintrag in /tmp/backup ein Verzeichnis ist, können Sie einfach Shell-Globs verwenden, um Ihr Array zu füllen. Wenn Sie möglicherweise Dateien sowie Verzeichniseinträge haben, müssen Sie find verwenden oder einen Shell-Testausdruck verwenden, um sicherzustellen, dass der Eintrag tatsächlich ein Verzeichnis ist. Zum Beispiel:

# Spezielle Handhabung aktivieren, um die Ausweitung auf eine
# wörtliche '/tmp/backup/*' zu verhindern, wenn keine Übereinstimmungen gefunden werden. 
shopt -s nullglob

FOLDERS=(/tmp/backup/*)
for folder in "${FOLDERS[@]}"; do
    [[ -d "$folder" ]] && echo "$folder"
done

# Shell-Option nach Bedarf deaktivieren. Nullglob
# ist standardmäßig deaktiviert.
shopt -u nullglob

3voto

Um das Subshell-Problem zu umgehen (siehe Antwort von Diego), können Sie auch folgendes tun:

while ....
done <<<$(ls)

2voto

Diego Sevilla Punkte 27639

while wird in einer Kindershell ausgeführt und kann die Variablen des Elternteils, in diesem Fall FOLDER, nicht ändern. Du solltest andere Wege ausprobieren. Zum Beispiel:

FOLDER=(`ls /tmp/backup`)
echo ${FOLDER[1]}

(wird die zweite Datei dort ausgeben)

HINWEIS: Ja, ich verstehe die Probleme dieser Lösung, Leerzeichen, Verwendung von ls, usw. Ich wollte nur auf das Problem mit while hinweisen. Um die Antwort zu vervollständigen, ja, Globbing sollte verwendet werden:

for dir in /tmp/backup/* ; do
    test -d "$dir" && do_stuff_with_dir("$dir")
done

Und, indem man nicht an Purismus stirbt, das Übliche (zumindest in UNIX) ist KEINE Leerzeichen in Dateinamen zu haben. Das ist schlecht für deine Gesundheit :)

0voto

nshy Punkte 1044

Wie bereits von den anderen erwähnt wurde, besteht eines der Probleme mit dem obigen Code darin, dass eine Variable in einer Unter-Shell geändert wird. Das andere Problem ist die Verwendung von += zur Befüllung des Arrays. Leider wird dadurch nur zum nullten Element als String hinzugefügt, sodass FOLDERS[1] undefiniert bleibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X