Habituellement, j'utilise des crochets dans l'instruction if:
if [ "$name" = 'Bob' ]; then ...
Mais, quand je vérifie si grep
a réussi, je n'utilise pas les crochets:
if grep -q "$text" $file ; then ...
Quand les crochets sont-ils nécessaires dans l'instruction if
?
Les crochets sont synonymes de la commande test
. Une instruction if
vérifie l'état de sortie d'une commande afin de décider quelle branche prendre. grep -q "$text"
est une commande, mais "$name" = 'Bob'
n'est pas - c'est juste une expression. test
est une commande, qui prend une expression et l'évalue:
if test "$name" = 'Bob'; then ...
Étant donné que les crochets sont synonymes de la commande test
, vous pouvez alors la réécrire en tant que votre déclaration d'origine:
if [ "$name" = 'Bob' ]; then ...
[
est en fait une commande, équivalente (presque, voir ci-dessous) à la commande test
. Cela ne fait pas partie de la syntaxe Shell. (Tous les deux [
et test
, selon le shell, sont souvent des commandes intégrées également, mais cela n'affecte pas leur comportement, sauf peut-être pour les performances.)
Une instruction if
exécute une commande et exécute la partie then
si la commande réussit, ou la partie else
(le cas échéant) en cas d'échec. (Une commande réussit si elle se termine avec un état ($?
) de 0, échoue s'il se termine avec un état différent de zéro.)
Dans
if [ "$name" = 'Bob' ]; then ...
la commande est
[ "$name" = 'Bob' ]
(Vous pouvez exécuter cette même commande directement, sans le if
.)
Dans
if grep -q "$text" $file ; then ...
la commande est
grep -q "$text" $file
man [
ou man test
pour plus d'informations.
NOTA: Eh bien, le [
la commande est presque équivalente à la commande test
. La différence est que [
a besoin ]
comme dernier argument, et test
ne le permet pas - et en fait ne le permet pas. (Il n'a pas avoir à implémenter de cette façon, mais un [
sans correspondance ]
aurait rendu beaucoup de gens très très nerveux.)
La meilleure façon de penser au [ ... ]
la syntaxe, c'est à considérer [
être un programme - ce que c'est!
Regarde ça:
~ $ ls /usr/bin/\[
/usr/bin/[
d'autre part, vous n'utilisez probablement pas cette version car bash
fournit également [
en tant que Shell intégré.
Quoi qu'il en soit, pour répondre à votre question: ce que if
fait, c'est d'exécuter la commande que vous lui donnez et de voir que la valeur de retour est 0
ou pas. Tu utilises [
pour faire d'autres comparaisons plus intéressantes telles que des comparaisons de chaînes. Voir man [
et man bash
.