Warum wird hier nichts aufgelistet? Danke
FOLDER=()
ls /tmp/backup/ | while read DIR
do
FOLDER+=("$DIR")
done
echo ${FOLDER[1]}
Warum wird hier nichts aufgelistet? Danke
FOLDER=()
ls /tmp/backup/ | while read DIR
do
FOLDER+=("$DIR")
done
echo ${FOLDER[1]}
Ihr Beispiel ist darauf ausgelegt, zu scheitern. Zum Beispiel:
ls
.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
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 :)
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 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.