Das ;Token ist ein Befehlstrennzeichen, ebenso wie Newline. Da thenes sich um einen separaten Befehl handelt, wird das vorhergehende Semikolon benötigt, um es in dieselbe Zeile schreiben zu können. Die Semikolons nach mkdirund fisind überflüssig.
Andreas Riedmüller
Antworten:
277
Erstens ist "[" in bash nur ein Befehl, der die Zeichenfolge "]" als letztes Argument erwartet, also das Leerzeichen vor der schließenden Klammer (sowie zwischen "!" Und "-d", die zwei separate Argumente sein müssen auch) ist wichtig:
Hinweis: Mit dem -pFlag werden bei Bedarf übergeordnete Verzeichnisse erstellt.
Danijel
13
Mein Gott, ich habe nie gewusst, dass "[" ein Befehl ist. Dies erklärt so viele meiner Probleme ... Das Nützlichste, was ich je auf StackOverflow gelesen habe.
Ben Kushigian
1
Beeindruckend! Zu wissen, dass "[" ein Befehl in Bash ist, ist ein solcher Augenöffner. Ich habe das Gefühl, dass viele Probleme mit meinen Bash-Skripten jetzt behoben sind!
Raluru
93
Es besteht eigentlich keine Notwendigkeit zu prüfen, ob es existiert oder nicht. Da Sie es bereits erstellen möchten, wenn es vorhanden ist, reicht nur mkdir aus
Das Argument -pignoriert Fehler nicht genau: Es ruft einen anderen Modus auf, in dem nicht vorhandene Pfadkomponenten erstellt werden (und daher ist es kein Fehler, wenn die Null erstellt werden muss). Das Verhalten ist anders, da andere als die letzte Komponenten erstellt werden, was wünschenswert sein kann oder nicht.
BeeOnRope
23
Sie benötigen Leerzeichen in [und ]Klammern:
#!/bin/bashif[!-d /home/mlzboy/b2c2/shared/db ]then
mkdir -p /home/mlzboy/b2c2/shared/db
fi
Nutzen Sie die Verknüpfungsbewertung von logischen Shell-Operatoren auf sauberere Weise. Die rechte Seite des Operators wird nur ausgeführt, wenn die linke Seite wahr ist.
mmh, nicht sauberer: nur kürzer. Es ist schwierig, die Bedeutung einer solchen Aussage zu verstehen, wenn Sie darauf stoßen.
Davide Orazio Montersino
1
Ich mag das, obwohl das -pArgument die Überprüfung unnötig macht. Sie können es weiterhin verwenden, wenn Sie es nicht verwenden möchten -p. In diesem Fall möchten Sie nicht, dass alle übergeordneten Verzeichnisse automatisch erstellt werden.
ADTC
3
Tatsächlich ist das Schreiben sogar noch kürzer [ -d /path/to/dir ] || mkdir /path/to/dir. Die rechte Seite wird ausgeführt, wenn die linke Seite falsch ist.
ADTC
4
Ich denke, Sie sollten Ihren Code ein wenig neu formatieren:
;
Token ist ein Befehlstrennzeichen, ebenso wie Newline. Dathen
es sich um einen separaten Befehl handelt, wird das vorhergehende Semikolon benötigt, um es in dieselbe Zeile schreiben zu können. Die Semikolons nachmkdir
undfi
sind überflüssig.Antworten:
Erstens ist "[" in bash nur ein Befehl, der die Zeichenfolge "]" als letztes Argument erwartet, also das Leerzeichen vor der schließenden Klammer (sowie zwischen "!" Und "-d", die zwei separate Argumente sein müssen auch) ist wichtig:
Zweitens ist
mkdir
diese Prüfung nutzlos , da Sie den Schalter -p verwenden, um zu wechseln , da dies in erster Linie der Fall ist. Einfach schreiben:und das ist es.
quelle
-p
Flag werden bei Bedarf übergeordnete Verzeichnisse erstellt.Es besteht eigentlich keine Notwendigkeit zu prüfen, ob es existiert oder nicht. Da Sie es bereits erstellen möchten, wenn es vorhanden ist, reicht nur mkdir aus
quelle
-p
Flag werden bei Bedarf übergeordnete Verzeichnisse erstellt.Einfach machen:
mkdir gibt einen Fehler aus, wenn der Ordner bereits vorhanden ist. Um die Fehler zu ignorieren, schreiben Sie:
Keine Notwendigkeit, irgendwelche Überprüfungen oder ähnliches durchzuführen.
Als Referenz:
-p, --parents no error if existing, make parent directories as needed
http://man7.org/linux/man-pages/man1/mkdir.1.htmlquelle
-p
ignoriert Fehler nicht genau: Es ruft einen anderen Modus auf, in dem nicht vorhandene Pfadkomponenten erstellt werden (und daher ist es kein Fehler, wenn die Null erstellt werden muss). Das Verhalten ist anders, da andere als die letzte Komponenten erstellt werden, was wünschenswert sein kann oder nicht.Sie benötigen Leerzeichen in
[
und]
Klammern:quelle
Nutzen Sie die Verknüpfungsbewertung von logischen Shell-Operatoren auf sauberere Weise. Die rechte Seite des Operators wird nur ausgeführt, wenn die linke Seite wahr ist.
quelle
-p
Argument die Überprüfung unnötig macht. Sie können es weiterhin verwenden, wenn Sie es nicht verwenden möchten-p
. In diesem Fall möchten Sie nicht, dass alle übergeordneten Verzeichnisse automatisch erstellt werden.[ -d /path/to/dir ] || mkdir /path/to/dir
. Die rechte Seite wird ausgeführt, wenn die linke Seite falsch ist.Ich denke, Sie sollten Ihren Code ein wenig neu formatieren:
quelle