web-dev-qa-db-fra.com

Quand faut-il mettre des crochets dans une instruction Bash if?

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?

58
Misha Moroshko

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 ...
105
chepner

[ 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.)

27
Keith Thompson

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.

9
cha0site