Quale comando significa "non fare nulla" in un condizionale in Bash?


180

A volte quando faccio i condizionali, ho bisogno che il codice non faccia nulla, ad esempio, qui, voglio che Bash non faccia nulla quando $aè maggiore di "10", stampa "1" se $aè inferiore a "5", altrimenti stampa "2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Questo però fa un errore. Esiste un comando che non farà nulla e che non rallenterà la mia sceneggiatura?

Risposte:


340

Il comando no-op nella shell è :(due punti).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Dal manuale di bash :

:(due punti)
Non fare altro che espandere gli argomenti ed eseguire reindirizzamenti. Lo stato di ritorno è zero.


3
@SaintHax No, non funziona true. È integrato nella shell e non fa nulla.
Barmar,

1
è la shell integrata (hai ragione), restituisce true (stato 0) proprio come fa true ed è più difficile da leggere. Bash è un linguaggio DevOps e se :è scritto da qualcuno del mio team, lo farei cambiare.
SaintHax,

3
@SaintHax Se qualcuno lo usasse truein un contesto non condizionale, lo farei cambiare. if trueva bene, then truesembra sbagliato.
Barmar,

1
Ovviamente, puoi semplicemente riscrivere il codice da usare if ! condition; then do something; fiinvece di if condition; then :; else do something; fi.
Barmar,

Sono d'accordo con te. Questo esempio potrebbe essere scritto se / elif / else utilizza condizioni composte e sarebbe meglio.
SaintHax,

38

Probabilmente puoi semplicemente usare il truecomando:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Un'alternativa, nel tuo esempio (ma non necessariamente ovunque) è riordinare il tuo if / else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
Se non testate entrambi i risultati truee in falseeffetti non siete interessati per quanto riguarda lo script, ma in linea di principio potrebbero borsare alcune shell che accettano questa sintassi, quindi forse :è meglio.
dmckee --- ex-moderatore gattino

3
La domanda è taggata bash. In bash truee falsesono integrati. Per conchiglie più grandi, true, false, e addirittura :potrebbe essere comandi esterni (anche se si sarebbe probabilmente vedere quest'ultimo solo in molto vecchi serbatoi).
Keith Thompson,

6
Preferisco :semplicemente perché è più esplicito quale sia l'intento
Freedom_Ben

9

Anche se non sto rispondendo alla domanda originale relativa al comando no-op, molti (se non la maggior parte) problemi quando si potrebbe pensare " in questo ramo non devo fare nulla " possono essere aggirati semplicemente ristrutturando la logica in modo che questo ramo vinca non succede.

Provo a dare una regola generale usando l'esempio dei PO

non fare nulla quando $ a è maggiore di "10", stampa "1" se $ a è inferiore a "5", altrimenti stampa "2"

dobbiamo evitare un ramo in cui ne $avalgono più di 10, così $a < 10come una condizione generale può essere applicata l'una all'altra, seguendo la condizione.

In termini generali, quando si dice fare nulla quando X , quindi riformulare come evitare una filiale dove X . Di solito puoi evitare l'evasione semplicemente negando X e applicandolo a tutte le altre condizioni.

Quindi l'esempio dei PO con la regola applicata può essere ristrutturato come:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Solo una variazione di quanto sopra, racchiudendo tutto nella $a < 10condizione:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(Per questo esempio specifico la ristrutturazione di @Flimzys è sicuramente migliore, ma volevo dare una regola generale per tutte le persone che cercano come non fare nulla.)


5
Uno dei motivi per cui qualcuno potrebbe voler avere una no-op è quando inizialmente strutturare il codice con l'idea che si aggiungerà "aggiungi qualcosa qui in seguito" senza avere effetti collaterali involontari. Ad esempio se uno sta inserendo un if-then-else-fi in un .bashrc, se lo metti echo "put stuff here"interromperà alcuni degli usi non di accesso (ad esempio scp viene interrotto) e solo lo spazio bianco / i commenti causano un errore di runtime.
Afide
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.