GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Einzeilige if/else-Bedingung im Linux-Shell-Scripting

Um die anderen Antworten für den allgemeinen Gebrauch zusammenzufassen:

Mehrzeilig wenn...dann Erklärung

if [ foo ]; then
    a; b
elif [ bar ]; then
    c; d
else
    e; f
fi

Einzeilige Version

if [ foo ]; then a && b; elif [ bar ]; c && d; else e && f; fi

Verwendung des ODER-Operators

( foo && a && b ) || ( bar && c && d ) || e && f;

Notizen

Denken Sie daran, dass die UND- und ODER-Operatoren auswerten, ob der Ergebniscode der vorherigen Operation gleich wahr/erfolgreich war (0 ). Wenn also eine benutzerdefinierte Funktion etwas anderes (oder gar nichts) zurückgibt, können Probleme mit der UND/ODER-Kurzschrift auftreten. In solchen Fällen möchten Sie vielleicht etwas wie ( a && b ) ersetzen mit ( [ a == 'EXPECTEDRESULT' ] && b ) usw.

Beachten Sie auch, dass ( und [ sind technisch gesehen Befehle, daher sind Leerzeichen um sie herum erforderlich.

Statt einer Gruppe von && Anweisungen wie then a && b; else , könnten Sie auch Anweisungen in einer Subshell wie then $( a; b ); else ausführen , obwohl dies weniger effizient ist. Dasselbe gilt für etwas wie result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] statt ( foo && a && b ) || ( bar && c && d ) . Obwohl Sie sich an diesem Punkt sowieso mehr mit weniger kompaktem, mehrzeiligem Zeug beschäftigen würden.


Es sieht so aus, als ob Sie auf dem richtigen Weg waren. Sie müssen nur die Else-Anweisung nach dem ";" hinzufügen. nach der "dann"-Anweisung. Außerdem würde ich die erste Zeile von der zweiten Zeile mit einem Semikolon trennen, anstatt sie mit "&&" zu verbinden.

maxline='cat journald.conf | grep "#SystemMaxUse="'; if [ $maxline == "#SystemMaxUse=" ]; then sed 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf > journald.conf2 && mv journald.conf2 journald.conf; else echo "This file has been edited. You'll need to do it manually."; fi

Außerdem haben Sie in Ihrem ursprünglichen Skript beim Deklarieren von maxline Backticks "`" anstelle von einfachen Anführungszeichen "'" verwendet, was Probleme verursachen könnte.


Es ist keine direkte Antwort auf die Frage, aber Sie könnten einfach den ODER-Operator verwenden

( grep "#SystemMaxUse=" journald.conf > /dev/null && sed -i 's/\#SystemMaxUse=/SystemMaxUse=50M/g' journald.conf ) || echo "This file has been edited. You'll need to do it manually."

Linux
  1. Wie parse ich Json mit Shell-Scripting in Linux?

  2. Einzeilige Bedingungsüberprüfung im Makefile?

  3. 6 Verkettungsoperatoren für Bash-Shell-Befehlszeilen unter Linux

  4. Wie liste ich einen Dateinamen pro Ausgabezeile in Linux auf?

  5. Was ist falsch an linux/if.h und net/if.h?

25 Fragen und Antworten zum Linux-Shell-Scripting-Interview

Shell-Scripting Teil I:Erste Schritte mit Bash-Scripting

Kostenloses eBook von Packt – Linux Shell Scripting Cookbook – Third Edition

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

Was ist Shebang in Linux Shell Scripting?

Bash-Skripting:So geben Sie Text in der Linux-Shell aus und formatieren ihn