web-dev-qa-db-fra.com

Opérateurs booléens (&&, -a, ||, -o) dans Bash

Quelqu'un peut-il s'il vous plaît expliquer la différence entre le &&, ||, -a, et -o Opérateurs Unix?

Quelles sont les restrictions sur l'utilisation des deux types?

Est-ce simplement que le && et || les opérateurs doivent être utilisés lors de l’utilisation d’indicateurs dans la condition?

Un péché:

[ "$1" = "yes" ] && [ -r $2.txt ]

contre:

[ "$1" = "yes" -a $2 -lt 3 ]
48
Victor Brunell

règle générale: Utilisez -a et -o entre crochets, && et || à l'extérieur.

Il est important de comprendre la différence entre la syntaxe Shell et la syntaxe du [ commande .

  • && et || sont des opérateurs de shell. Ils sont utilisés pour combiner les résultats de deux commandes. Comme ils ont une syntaxe Shell, ils ont une signification syntaxique particulière et ne peuvent pas être utilisés comme arguments de commandes.

  • [ n'est pas une syntaxe spéciale. C'est en fait une commande avec le nom [, également connu sous le nom de test. Puisque [ n'est qu'une commande normale, il utilise -a et -o pour ses opérateurs et et ou . Il ne peut pas utiliser && et || _ parce que ce sont des syntaxes Shell que les commandes ne sont pas visibles.

Mais attendez! Bash a une syntaxe de test plus sophistiquée sous la forme [[ ]]. Si vous utilisez des crochets doubles, vous aurez accès à des éléments tels que les expressions rationnelles et les caractères génériques. Vous pouvez également utiliser des opérateurs Shell comme &&, ||, <, et > librement dans les crochets car, contrairement à [, la forme entre crochets correspond à la syntaxe spéciale de Shell. Bash analyse [[ lui-même pour pouvoir écrire des choses comme [[ $foo == 5 && $bar == 6 ]].

122
John Kugelman

-a et -o sont les plus anciens et/ou les opérateurs de la commande test. && et || sont et/ou des opérateurs pour le shell. Donc (en supposant un vieux Shell) dans votre premier cas,

[ "$1" = 'yes' ] && [ -r $2.txt ]

Shell évalue le et la condition. Dans votre deuxième cas,

[ "$1" = 'yes' -a $2 -lt 3 ]

La commande de test (ou test intégré) évalue la condition et.

Bien sûr, dans tous les shells modernes ou semi-modernes, la commande de test est intégrée au shell, il n'y a donc aucune différence, ni grande différence. Dans les shells modernes, l'instruction if peut être écrite:

[[ $1 == yes && -r $2.txt ]]

Ce qui est plus semblable aux langages de programmation modernes et est donc plus lisible.

15
Brad Lanam