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."