Toute commande une fois terminée renvoie un code de retour, sous la forme d'un nombre entier. La valeur 0 signifie généralement que tout s'est bien déroulé. Une valeur différente de 0 signifie au contraire qu'un erreur s'est produite.
Le code de retour de la dernière commande est toujours accessible via la variable spéciale `$?' :
$ grep -q laurent /etc/passwd
$ echo $?
=> 0
$ grep -q toto /etc/passwd
$ echo $?
=> 1
$ grep -q laurent /etc/passwd ; echo "Code retour : $?"
=> Code retour : 0
$ echo $?
=> 0
$ grep -q toto /etc/passwd ; echo "Code retour : $?"
=> Code retour : 1
$ echo $?
=> 0
$ grep -q toto /etc/passwd ; code_erreur=$?; echo "Coderetour : $code_erreur"
=> Code retour : 1
$ echo $code_erreur
1
Le `||' permet d'exécuter une commande seulement si la première a échoué :
$grep -q toto /etc/passwd || echo toto
=> toto
$grep -q laurent /etc/passwd || echo toto
Inversement, `&&' permet d'exécuter une commande seulement si la première a retourné 0 :
$grep -q toto /etc/passwd && echo toto
$grep -q laurent /etc/passwd || echo toto
=> toto
On préferrera généralement utiliser la construction `if', qui est plus clair syntaxiquement parlant, bien que moins consise. Mais c'est pas mal une affaire goût.