2013-07-11 7 views
104

A volte quando faccio condizionali, ho bisogno che il codice non faccia nulla, ad es. Qui voglio che BASH non faccia nulla quando $a è maggiore di "10", stampa "1" se $a è minore di "5", altrimenti, stampa "2":Che comando significa "non fare nulla" in un condizionale in BASH?

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

Questo tuttavia genera un errore. Esiste un comando che non farà nulla e che non rallenterà la mia sceneggiatura?

risposta

207

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 bash manual:

: (due punti)
fare nulla al di là espansione argomenti e l'esecuzione di reindirizzamenti. Lo stato di ritorno è zero.

+0

per l'istruzione,: è un operatore che esegue "true". Preferisco di gran lunga il vero in casi come questi, poiché è molto più facile da leggere. – SaintHax

+1

@SaintHax No, non viene eseguito 'true'. È incorporato nella shell e non fa nulla. – Barmar

+1

è integrato nella shell (è corretto), restituisce true (stato 0) esattamente come fa true ed è più difficile da leggere. Bash è un linguaggio DevOps, e se ':' è scritto da qualcuno nel mio team, vorrei che lo cambiasse. – SaintHax

28

probabilmente si può solo utilizzare il comando true:

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

Un'alternativa, nel tuo esempio caso (ma non necessariamente in tutto il mondo) è quella di ri-ordinare il vostro if/else:

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

Se non si verifica il risultato, sia 'true' che' false' sono effettivamente non opzionali per quanto riguarda lo script, ma in linea di principio * potrebbero * inserire alcune shell che accettano questa sintassi, quindi forse ':' è meglio. – dmckee

+2

La domanda è contrassegnata bash. In bash, 'true' e' false' sono integrati. Per shell più vecchie, 'true',' false', e anche ':' potrebbero essere comandi esterni (anche se probabilmente si vedrà quest'ultimo solo in * molto * vecchie shell). –

+4

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

9

Anche se non sto rispondendo alla domanda originale concering il comando no-op, molti (se non la maggior parte) i problemi quando si possa pensare "in questo ramo che devo fare nulla" può essere aggirato semplicemente ristrutturazione della logica in modo che questo ramo non si verifichi.

cerco di dare una regola generale utilizzando il PO esempio

fare nulla quando $ a è maggiore di "10", stampa "1" se $ a è inferiore a "5", in caso contrario, print "2"

dobbiamo evitare un ramo in cui $a ottiene più di 10, in modo $a < 10 come condizione generale può essere applicata a tutti gli altri, a seguito di condizioni.

In termini generali, quando si dice fare nulla quando X, quindi riformulare come evitare un ramo dove X. Di solito è possibile evitare l'annullamento semplicemente annullando X e applicandolo a tutte le altre condizioni.

Quindi l'esempio OP 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 variante di quanto sopra, che racchiude tutto ciò che nella condizione $a < 10:

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

(Per questo esempio specifico @Flimzys restructuring è sicuramente meglio, ma volevo dare una regola generale a tutte le persone che cercavano come non fare nulla.)

+0

Una ragione per cui qualcuno potrebbe voler avere un no-op è quando inizialmente si struttura il codice con l'idea che si aggiungerà "aggiungi qualcosa qui dopo" senza avere effetti collaterali involontari. Per esempio. se uno sta mettendo un if-then-else-fi in un file .bashrc, se metti 'echo" metti i file qui "' interromperà alcuni usi non di login (ad esempio scp si rompe), e solo spazi bianchi/i commenti causano un errore di runtime. – Aphoid

Problemi correlati