Ich entschuldige mich im Voraus, wenn dies eine doppelte Frage ist. Ich habe mich bemüht zu suchen / zu überprüfen, bevor ich hier gefragt habe.
Ich schreibe gerne Einzeiler wie folgt:
foocommand && foocommand2 && foocommand3
Die Idee ist, dass nachfolgende Befehle nur ausgeführt werden sollen, wenn der vorherige "erfolgreich" war.
Ich schreibe ein etwas langwieriges Skript und dieser Einzeiler ist nicht machbar, weil er für alle anderen wie ein riesiger Block verwirrenden Codes aussieht.
Ich möchte die Befehle ausräumen und Kommentare dazwischen im Skript schreiben. Wie kann ich das tun und habe trotzdem das Äquivalent von && drin?
&&
bedeutet nicht , der nachfolgende Befehl wird ausgeführt , wenn der vorherige ein erfolgreich war. Es bedeutet , dass der Befehl ausgeführt werden soll , wenn das kollektive Ergebnis von all den vorherigen Befehlen in der Befehlsliste ist der Erfolg. Sie wissen das vielleicht, aber zukünftige Leser verstehen das vielleicht falsch.||
und wird&&
(im Gegensatz zu|
oder&
) Kurzschluss genannt. Das mit den letzteren Operatoren verwendete Verhalten wird als eifrige Auswertung bezeichnet.a && b && c
wird nur ausgeführt,b
wenn diesa
erfolgreich ist. "Es wird nur ausgeführt,c
wenn diesb
erfolgreich ist" und "Es wird nur ausgeführt,c
wenna
undb
beide erfolgreich sind" sind äquivalente Anweisungen:b
Kann nicht erfolgreich sein, wenn dies nichta
erfolgreich ist.a || b && c
ist anschaulicher.true || false && echo hi
wird ausgegebenhi
. Die Spezifikation lautet, Die Operatoren "&&" und "||" haben die gleiche Priorität und werden mit linker Assoziativität bewertet.Antworten:
Du kannst es so machen:
Ich hoffe, ich habe verstanden, was Sie richtig gefragt haben.
quelle
Sie können die shebang Linie zu ändern
Nach einem Fehler wird das Skript beendet.
quelle
bash
Teils natürlich). Die POSIX-Shell bietet eine Reihe von Optionen, die für zutreffend sindset
. Oder umgekehrt?set
Dies ist eine Möglichkeit, Shell-Befehlszeilenoptionen im Skript festzulegen.-e
möglicherweise schlecht verhalten. Zum Beispiel möchten Sie wahrscheinlich nicht, dass Ihr Skript jedes Mal beendet wird, wenn Siediff
zwei nicht identische Dateien haben. Sie können das natürlich umgehen, indem Sie solche Befehle anhängen|| true
(oder vielleicht auch anhängen|| [ $? = 1 ]
), aber das OP erwähnt "alle anderen", die dieses Skript lesen müssen, und sagt, dass "alle anderen" wahrscheinlich nicht daran gewöhnt sind fertig werden mit-e
.-e
auf "she-bang" gesetzt, bis ein Administrator meiner Firma meine Skripte weiterhin mit startetebash myscript.sh
, also ignorierte er das-e
. Jetzt haben alle meine Skripte einset -e
in der zweiten Zeile.Wenn Ihnen die
set -e
Idee nicht gefällt , können Sie vielleicht die Logik umkehren.Ersetzen Sie sie sinnvollerweise durch
exit
etwas, um eine nützliche Fehlermeldung zu drucken, und beenden Sie sie dann. Innerhalb einer Funktion möchten Sie natürlichreturn
stattexit
.quelle
foocommand || exit
um mitfoocommand
dem Beendigungsstatus zu beenden, wenn er nicht Null ist.Sie können
if else fi
stattdessen Blöcke verwenden.Es ist etwas lesbarer.
Alternativ können Sie
\
Ihren Big 1 Liner auch einfach in mehrere Zeilen aufteilenAber natürlich kann dies für das ungeübte Auge verwirrend sein.
quelle
\
dort notwendig ist.Sie können auch verschachtelte
if
Anweisungen verwenden. Eine andere Möglichkeit ist die Verwendung von Curly, um eine Gruppe zu bilden{ true && echo hi; } || echo huh
Update 1:
Hier ist ein Beispiel ohne Zeilenumbrüche / Kommentare:
quelle
Teilen Sie jede Befehlssequenz in Funktionen auf:
quelle
Ich schreibe immer gerne eine "Fehler" -Funktion, mit der ich angeben kann, was ich tun wollte, als der Fehler auftrat, und dann das
||
Muster verwenden. Wie die folgenden:quelle