GNU/Linux >> Linux Esercitazione >  >> Linux

Condizione if/else di una riga nello scripting della shell linux

Per riassumere le altre risposte, per uso generale:

if...then su più righe dichiarazione

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

Versione a riga singola

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

Utilizzo dell'operatore OR

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

Note

Ricorda che gli operatori AND e OR valutano se il codice risultato dell'operazione precedente è stato uguale a true/success (0 ). Quindi, se una funzione personalizzata restituisce qualcos'altro (o niente del tutto), potresti riscontrare problemi con la scorciatoia AND/OR. In questi casi, potresti voler sostituire qualcosa come ( a && b ) con ( [ a == 'EXPECTEDRESULT' ] && b ) , ecc.

Nota anche che ( e [ sono tecnicamente comandi, quindi è necessario uno spazio bianco attorno a essi.

Invece di un gruppo di && istruzioni come then a && b; else , potresti anche eseguire istruzioni in una subshell come then $( a; b ); else , anche se questo è meno efficiente. Lo stesso vale per fare qualcosa come result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] invece di ( foo && a && b ) || ( bar && c && d ) . Anche se a quel punto ti occuperesti comunque di cose meno compatte e multilinea.


Sembra che tu fossi sulla strada giusta. Devi solo aggiungere l'istruzione else dopo il ";" dopo l'affermazione "allora". Inoltre dividerei la prima riga dalla seconda riga con un punto e virgola invece di unirla con "&&".

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

Anche nel tuo script originale, quando dichiari maxline hai usato i back-tick "`" invece delle virgolette singole "'" che potrebbero causare problemi.


Non è una risposta diretta alla domanda, ma potresti semplicemente usare l'operatore 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. Come utilizzare le funzioni della shell della riga di comando in Linux

  2. Simbolo di apice inverso (`) negli script della shell di Linux

  3. Come posso elencare un nome file per riga di output in Linux?

  4. Cosa c'è di sbagliato in linux/if.h e net/if.h?

  5. Esegui uno script reindirizzato da stdin (Linux/Shell Scripting)

25 Domande e risposte sull'intervista sugli script della shell di Linux

Shell Scripting Parte I:Introduzione agli script bash

EBook gratuito da Packt - Ricettario per script di shell Linux - Terza edizione

Script di shell per principianti - Come scrivere script Bash in Linux

Che cos'è Shebang negli script della shell di Linux?

Bash Scripting:come generare e formattare il testo su Linux Shell