GNU/Linux >> Znalost Linux >  >> Linux

Jeden řádek if/else podmínka ve skriptování linuxového shellu

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

Linux
  1. Jak používat funkce shellu příkazového řádku v Linuxu

  2. Symbol backtick (`) v Linux Shell Scripting

  3. Jak mohu uvést jeden název souboru na výstupní řádek v Linuxu?

  1. Co je špatného na linux/if.h a net/if.h?

  2. Spuštění skriptu z stdin (Linux/Shell Scripting)

  3. odesílání pošty z linuxového terminálu v jednom řádku

  1. Aliasy příkazového řádku v prostředí Linux

  2. Jak analyzovat Json pomocí skriptování Shell v Linuxu?

  3. Kontrola stavu jednoho řádku v Makefile?