L'operatore && esegue il comando successivo se il comando precedente ha avuto un'esecuzione corretta, (codice di uscita restituito ($?) 0 = logico vero).
Nella forma A && B || C
, viene valutato il comando (o condizione) A e se A restituisce true (esito positivo, codice di uscita 0), viene eseguito il comando B. Se A fallisce (quindi restituirà false - codice di uscita diverso da 0) e / o B fallisce (restituendo false ), verrà eseguito il comando C.
Inoltre, l' &&
operatore viene utilizzato come AND in controlli delle condizioni e l'operatore ||
funziona come OR nei controlli delle condizioni.
A seconda di ciò che si desidera fare con lo script, il modulo A && B || C
può essere utilizzato per i controlli delle condizioni come il tuo esempio o può essere utilizzato per concatenare i comandi e garantire una serie di comandi da eseguire se i comandi precedenti avevano un codice di uscita 0 riuscito .
Questo è il motivo per cui è comune vedere i comandi come:
do_something && do_something_else_that_depended_on_something
.
Esempi:
apt-get update && apt-get upgrade
se l'aggiornamento non riesce, l'aggiornamento non viene eseguito (ha senso nel mondo reale ...).
mkdir test && echo "Something" > test/file
La parte echo "Something"
verrà eseguita solo se l' mkdir test
operazione è andata a buon fine e l'operazione ha restituito il codice di uscita 0 .
./configure --prefix=/usr && make && sudo make install
Di solito si trova sulla compilazione di lavori per concatenare i comandi dipendenti necessari insieme.
Se provi a implementare sopra le "catene" con if - allora - altrimenti avrai bisogno di molti più comandi e controlli (e quindi più codice da scrivere - più cose da andare storto) per un semplice compito.
Inoltre, tieni presente che i comandi concatenati con && e || vengono letti dalla shell da sinistra a destra. Potrebbe essere necessario raggruppare i comandi e i controlli delle condizioni tra parentesi per dipendere dal passaggio successivo dall'output corretto di alcuni comandi precedenti. Ad esempio vedi questo:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
O un esempio di vita reale:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Tieni presente che alcuni comandi restituiscono codici di uscita diversi a seconda del processo eseguito o restituiscono codici diversi a seconda delle loro azioni (ad esempio il comando GNU diff
, restituisce 1 se due file differiscono e 0 se non lo fanno). Tali comandi devono essere trattati con cura in && e || .
Anche solo per avere tutti i puzzle insieme, attenzione alla concatenazione dei comandi usando l' ;
operatore. Con un formato A;B;C
tutti i comandi verranno eseguiti in serie, indipendentemente dal codice di uscita del comando A
e B
.