Abychom shrnuli ostatní odpovědi, pro obecné použití:
Víceřádkový pokud...tak prohlášení
if [ foo ]; then
a; b
elif [ bar ]; then
c; d
else
e; f
fi
Jednořádková verze
if [ foo ]; then a && b; elif [ bar ]; c && d; else e && f; fi
Pomocí operátoru OR
( foo && a && b ) || ( bar && c && d ) || e && f;
Poznámky
Pamatujte, že operátory AND a OR vyhodnocují, zda se výsledný kód předchozí operace rovnal hodnotě true/success (0
). Pokud tedy uživatelská funkce vrátí něco jiného (nebo vůbec nic), můžete narazit na problémy se zkratkou AND/OR. V takových případech můžete chtít nahradit něco jako ( a && b )
s ( [ a == 'EXPECTEDRESULT' ] && b )
, atd.
Všimněte si také, že (
a [
jsou technicky příkazy, takže je kolem nich vyžadováno prázdné místo.
Místo skupiny &&
příkazy jako then a && b; else
, můžete také spouštět příkazy v subshell jako then $( a; b ); else
, i když je to méně efektivní. Totéž platí pro provedení něčeho jako result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ]
místo ( foo && a && b ) || ( bar && c && d )
. I když v tu chvíli byste se stejně dostali více do méně kompaktních, víceřádkových věcí.
Vypadá to, jako byste byli na správné cestě. Stačí přidat příkaz else za ";" po prohlášení „pak“. Také bych oddělil první řádek od druhého řádku středníkem namísto spojení pomocí "&&".
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
Také ve vašem původním skriptu jste při deklaraci maxline použili zpětná zaškrtnutí "`" místo jednoduchých uvozovek "'", což by mohlo způsobit problémy.
Není to přímá odpověď na otázku, ale stačí použít operátor OR
( 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."