• # Qlqs différences

    Posté par . En réponse au message différence entre [[ condition ]] et [ condition ]. Évalué à 10.

    Dans un répertoire initialement vide :
     % [ 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 [ ... ] :
    % [[ XXXfoo123XXX =~ "(foo)([0-9]+)" ]] && echo plop
    plop
    % echo ${BASH_REMATCH[0]}
    foo123
    % echo ${BASH_REMATCH[1]}
    foo
    % echo ${BASH_REMATCH[2]}
    123
    Et puis [[ ... ]] il est souvent plus robuste, genre il ne t'en voudra pas de ne pas quoter un variable vide :
    % unset plop
    % [ foo == $plop ] && echo plop
    -bash: [: foo: unary operator expected
    % [ foo == "$plop" ] && echo plop
    % [[ foo == $plop ]] && echo plop
    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
    Comme ça là je n'en ai pas d'autre qui me vienne.