149 votes

bash si différence entre crochets et doubles crochets

Je lis des exemples de bash sur if mais certains exemples sont écrits avec des crochets simples :

if [ -f $param ]
then
  #...
fi

d'autres avec des doubles crochets

if [[ $? -ne 0 ]]
then
    start looking for errors in yourlog
fi

quelle est la différence ?

173voto

cmh Points 4290

Simple [] sont des tests de condition conformes au shell posix.

Double [[]] sont une extension de la norme [] et sont supportés par bash et d'autres shells (par exemple zsh, ksh). Ils supportent des opérations supplémentaires (ainsi que les opérations standard de Posix). Par exemple : || au lieu de -o et la correspondance regex avec =~ . Une liste plus complète des différences peut être trouvée dans le site web de la Commission européenne. section du manuel bash sur les constructions conditionnelles .

Utilisez [] lorsque vous voulez que votre script soit portable à travers les shells. Utilisez [[]] si vous voulez des expressions conditionnelles non prises en charge par [] et n'ont pas besoin d'être portables.

14voto

sampson-chen Points 13413

À l'intérieur de parenthèses simples pour le test de condition (c'est-à-dire [ ... ]), certains opérateurs tels que le test de condition simple [ ... ] peuvent être utilisés. = est supporté par tous les shells, alors que l'utilisation de l'opérateur == n'est pas supporté par certains des anciens shells.

À l'intérieur de doubles crochets pour le test de condition (c'est-à-dire [[ ... ]]), il n'y a pas de différence entre l'utilisation de = ou == dans des coquilles anciennes ou nouvelles.

Edit : Je dois aussi noter que : En bash, utilisez toujours les doubles crochets [[ ... ]] si possible, car c'est plus sûr que les crochets simples. Je vais illustrer pourquoi avec l'exemple suivant :

if [ $var == "hello" ]; then

si $var se trouve être null / empty, alors c'est ce que le script voit :

if [ == "hello" ]; then

ce qui brisera votre script. La solution est soit d'utiliser des doubles crochets, soit de toujours penser à mettre des guillemets autour de vos variables ( "$var" ). La double parenthèse est une meilleure pratique de codage défensif.

11voto

sputnick Points 31663

[[ est un mot-clé bash similaire à (mais plus puissant que) l'option [ commandement. Voir http://mywiki.wooledge.org/BashFAQ/031 et http://mywiki.wooledge.org/BashGuide/TestsAndConditionals

A moins que vous n'écriviez pour POSIX sh, nous recommandons [[

1voto

asf107 Points 623

vous pouvez utiliser les doubles crochets pour une correspondance regex légère, par exemple :

if [[ $1 =~ "foo.*bar" ]] ; then

(pour autant que la version de bash que vous utilisez supporte cette syntaxe)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X