Ich mag für die Existenz von mehreren Verzeichnissen überprüfen, sagen, dir1
, dir2
und dir3
, im Arbeitsverzeichnis.
Ich habe folgendes
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Aber ich vermute, es gibt einen eleganteren Weg, dies zu tun. Gehen Sie nicht davon aus, dass die Namen der Verzeichnisse ein Muster enthalten.
Ziel ist es, die Existenz einiger Verzeichnisse und die Nichtexistenz anderer zu überprüfen.
Ich verwende Bash, aber tragbarer Code wird bevorzugt.
shell-script
shell
files
directory
control-flow
Eleganz
quelle
quelle
$PWD
übrigens nicht.[ -d "$PWD/dir1"]
ist äquivalent zu[ -d "dir1" ]
.Antworten:
Wenn Sie bereits erwarten, dass es sich um Verzeichnisse handelt, und nur prüfen, ob sie alle vorhanden sind, können Sie den Exit-Code des
ls
Dienstprogramms verwenden, um festzustellen, ob ein oder mehrere "Fehler" aufgetreten sind :Ich leite die Ausgabe und stderr
/dev/null
um, um sie verschwinden zu lassen, da wir uns nur um den Exit-Code von kümmernls
, nicht um dessen Ausgabe. Alles, was geschrieben wurde,/dev/null
verschwindet - es wird nicht in Ihr Terminal geschrieben.quelle
1
ist stdout,2
ist stderr und ich weiß, was Umleitung ist. Ich verstehe die Bedeutung von nicht/dev/null
und weiß nicht, wie ich den Befehl analysieren soll.&>filename
sowohl stdout als auch stderr an weitergeleitet werdenfilename
. Könnte der Befehl also nicht vereinfacht werden (zumindest für mich ist es einfacher) alsls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
Option (a) verwenden, umls
nur die Verzeichnisse zu statisieren und nicht zu lesen, und (b) damit der Befehl auch dann erfolgreich ist, wenn der Benutzer keinen Lesezugriff auf die Verzeichnisse hat. (2) Ich sehe keinen Grund, dies zu tun,"$PWD/"
außer um mich vor Verzeichnissen zu schützen, deren Namen beginnen-
(und natürlich gibt es bessere Möglichkeiten, dies zu tun).Ich würde schleifen:
Dies führt dazu,
break
dass die Schleife kurzgeschlossen wird, genau wie Ihre Kette von&&
quelle
Eine Schleife könnte eleganter sein:
Das ist Bash. Ein tragbareres ist Sh. Dort können Sie das Positionsarray verwenden:
Dann zum Schleifen verwenden
"$@"
.quelle
Warum nicht einfach:
quelle
But I suspect there is a more elegant way of doing this
-a
: "-a
und-o
binären Primäroperatorentest
(aka[
) dreimal auf, dies ruft es einmal auf,Gemäß der Frage zwei tragbare Shell-Funktionen, die die Existenz und Nichtexistenz mehrerer Verzeichnisse testen:
Beispiel:
quelle
Aufbauend auf Glenn Jackmans Antwort können wir testen, ob andere Namen wie diese nicht existieren:
Ich habe immer[ -e "$dir" ]
getestet, ob es"$dir"
existiert. Das heißt, wenndir5
vorhanden, aber eine Datei ist, ist das ErgebnisFalse
. Wenn Sie nur testen möchten, ob die Namen in der zweiten Gruppe Verzeichnisse sind, verwenden Sie[ -d "$dir" ]
wie in der ersten Schleife.Da es darum geht, das Vorhandensein von Dingen im aktuellen Arbeitsverzeichnis zu überprüfen, ist es wahrscheinlich nicht erforderlich,
$PWD/
die Namen anzugeben . mach einfachquelle