% [ foo == f* ] && echo oui || echo non
non
% touch foo
% [ foo == f* ] && echo oui || echo non
oui
% touch foo2
% [ foo == f* ] && echo oui || echo non
-bash: [: too many arguments
non
Bref tu l'a compris, dans un [ ... ] bash fait l'expansion des jokers sur les noms de fichiers. [[ ... ]] ne le fait pas lui, il utilise les jokers comme des patterns dans la comparaison de chaine, et donc [[ foo == f* ]] sera toujours vrai.
En plus, le [[ ... ]] de bash-3 introduit un opérateur très intérressant, =~, pour évaluer des regexp. Y'a pas ça dans [ ... ] :
Pareil avec le "word spliting" des chaines avec des espaces :
% foo="a b c"
% [ "a b c" == $foo ] && echo plop
-bash: [: too many arguments
% [ "a b c" == "$foo" ] && echo plop
plop
% [[ "a b c" == $foo ]] && echo plop
plop
(m'enfin bon, ça reste une bonne habitude de quoter systématiquement ceci dit).
En résumé, voilà les 2 différences aux quelles j'ai pensé perso :
expansion différente (pas de filename ou de word splitting dans le [[ ... ]], or c'est souvent ce qu'on ne veut pas justement, donc ça tombe bien)
un opérateur =~ qui permet d'éviter bien des forks de grep et autres sed inutiles pour les cas simples
# Qlqs différences
Posté par tgl . En réponse au message différence entre [[ condition ]] et [ condition ]. Évalué à 10.
% [[ XXXfoo123XXX =~ "(foo)([0-9]+)" ]] && echo plop plop % echo ${BASH_REMATCH[0]} foo123 % echo ${BASH_REMATCH[1]} foo % echo ${BASH_REMATCH[2]} 123Et puis [[ ... ]] il est souvent plus robuste, genre il ne t'en voudra pas de ne pas quoter un variable vide : Pareil avec le "word spliting" des chaines avec des espaces : (m'enfin bon, ça reste une bonne habitude de quoter systématiquement ceci dit). En résumé, voilà les 2 différences aux quelles j'ai pensé perso :- expansion différente (pas de filename ou de word splitting dans le [[ ... ]], or c'est souvent ce qu'on ne veut pas justement, donc ça tombe bien)
- un opérateur =~ qui permet d'éviter bien des forks de grep et autres sed inutiles pour les cas simples
Comme ça là je n'en ai pas d'autre qui me vienne.