Una linea di if/else condizione di scripting shell linux

Vorrei avere l’equivalente di quanto segue in una sola riga if/else condizione.

$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  

Sto tentando di mettere questo in una sola riga di comando. Finora ho ottenuto tutto, ma l’altra parte del comando. Ecco ciò che ho finora…

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; fi

Così come posso includere la parte altra del codice di cui sopra, nel mio comando? Grazie per il vostro aiuto in anticipo.

  • Perchè vuoi fare una cosa del genere, fa solo il tuo codice illeggibile…
  • Sto cercando di dare a qualcuno un comando per cambiare il loro log file conf, ma cercando di fare un c&p cosa si può semplicemente eseguire in proprio terminale senza dover dilettarsi con la creazione di file e chmodding loro.
  • Come per lo “perché qualcuno dovrebbe” usare una sola riga di se-tene… perché qualcuno dovrebbe utilizzare [ invece di test, o utilizzare | contro cat o /dev/stdin, o utilizzare mv quando si potrebbe fare un alias di nome move_file, etc.? Il motivo è per la stenografia, nei casi in cui si desidera utilizzarlo. Potrebbe essere una scelta personale, o potrebbe non essere. Ma se la leggibilità è una preoccupazione importante, la riga di comando, in generale, non sarà il posto migliore per voi.

 

3 Replies
  1. 24

    Sembra come se si fosse sulla strada giusta. Hai solo bisogno di aggiungere l’istruzione else dopo il “;” dopo il “poi” istruzione. Anche io vorrei dividere la prima linea seconda linea con un punto e virgola invece di unirsi 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, in caso di dichiarazione maxline utilizzato back-zecche “`” invece di apici “‘”, che potrebbero causare problemi.

    • Che comando funzionato alla perfezione! &Amp;& invece del punto e virgola, era ciò che stava causando problemi.
  2. 5

    Non è una risposta diretta alla domanda, ma si potrebbe utilizzare l’O-operatore

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

    Per riassumere le altre risposte, per uso generale:

    Multi-linea se…poi istruzione

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

    A linea singola versione

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

    Utilizzando l’operatore or

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

    Note

    Ricordare che gli operatori and E or valutare se o non il codice del risultato della precedente operazione è stato pari a vero/successo (0). Quindi, se una funzione personalizzata restituisce qualcosa d’altro (o nulla), si può incorrere in problemi con la E/O sintetici. In tali casi, potrebbe essere necessario sostituire qualcosa come ( a && b ) con ( [ a == 'EXPECTEDRESULT' ] && b ), etc.

    Anche notare che ( e [ sono tecnicamente comandi, quindi spazio necessario intorno a loro.

    Invece di un gruppo di && dichiarazioni come then a && b; else, si potrebbe anche eseguire istruzioni in una subshell come then $( a; b ); else, anche se questo è meno efficiente. Lo stesso è vero per fare qualcosa di simile result1=$( foo; a; b ); result2=$( bar; c; d ); [ "$result1" -o "$result2" ] invece di ( foo && a && b ) || ( bar && c && d ). Anche se a quel punto si sarebbe sempre più in meno compatto, multi-linea di roba comunque.

Lascia un commento