Quelle est la différence entre [et [[dans Bash?

J’ai regardé la page de manuel bash et le [[ indique qu’il utilise des expressions conditionnelles. Ensuite, j’ai regardé la section Expressions conditionnelles et elle répertorie les mêmes opérateurs que test (et [ ).

Alors, je me demande quelle est la différence entre [ et [[ dans Bash?

[[ est l’amélioration de bash à la [ commande. Il a plusieurs améliorations qui en font un meilleur choix si vous écrivez des scripts qui ciblent bash. Mes favoris sont:

  1. C’est une caractéristique syntaxique du shell, donc il a un comportement spécial que [ n’a pas. Vous n’avez plus besoin de citer des variables telles que mad, car [[ gère les chaînes vides et les chaînes avec des espaces plus intuitivement. Par exemple, avec [ vous devez écrire

     if [ -f "$file" ] 

    gérer correctement les chaînes vides ou les noms de fichiers avec des espaces. Avec [[ les citations sont inutiles:

     if [[ -f $file ]] 
  2. Comme il s’agit d’une fonctionnalité syntaxique, il vous permet d’utiliser && et || opérateurs pour les tests booléens et < et > pour les comparaisons de chaînes. [ ne peut pas faire cela parce que c'est une commande régulière et && , || , < et > ne sont pas transmis aux commandes régulières en tant qu’arguments de ligne de commande.

  3. Il a un merveilleux opérateur =~ pour faire des correspondances d’expression régulières. Avec [ vous pourriez écrire

     if [ "$answer" = y -o "$answer" = yes ] 

    Avec [[ vous pouvez écrire ceci comme

     if [[ $answer =~ ^y(es)?$ ]] 

    Il vous permet même d'accéder aux groupes capturés qu'il stocke dans BASH_REMATCH . Par exemple, ${BASH_REMATCH[1]} serait "es" si vous avez tapé un "oui" complet ci-dessus.

  4. Vous obtenez gratuitement une correspondance de motif avec la globalisation. Peut-être que vous êtes moins ssortingct sur la façon de taper oui. Peut-être que ça va si l'utilisateur tape y-Rien. Vous avez couvert:

     if [[ $ANSWER = y* ]] 

Gardez à l'esprit que c'est une extension bash, donc si vous écrivez des scripts compatibles sh, vous devez vous en tenir à [ . Assurez-vous d'avoir la ligne #!/bin/bash shebang pour votre script si vous utilisez des doubles crochets.

Voir également

  • Bash FAQ - "Quelle est la différence entre test, [et [[?"
  • Bash Practices - Bash Tests
  • Server Fault - Quelle est la différence entre les doubles et simples crochets dans bash?
  • [ est le même que le test intégré, et fonctionne comme le test binary (test de l’homme)
    • fonctionne à peu près comme dans [ tous les autres shells basés sur sh dans de nombreux environnements UNIX
    • ne supporte qu’une seule condition. Plusieurs tests avec le bash && et || Les opérateurs doivent être entre parenthèses.
    • ne supporte pas nativement un opérateur “non”. Pour inverser une condition, utilisez un ! en dehors de la première tranche pour utiliser la fonctionnalité du shell pour inverser les valeurs de retour de commande.
    • == et != sont des comparaisons de chaînes littérales
  • [[ est un bash
    • est spécifique à bash, bien que d’autres shells aient implémenté des constructions similaires. Ne t’attends pas à ça dans une vieille école UNIX sh.
    • == et != appliquer les règles de correspondance de modèle bash, voir “Correspondance de modèle” dans man bash
    • a un opérateur de correspondance de regex =~
    • permet l’utilisation de parenthèses et le ! , && et || opérateurs logiques entre parenthèses pour combiner des sous-expressions

En dehors de cela, ils sont assez similaires – la plupart des tests individuels fonctionnent de manière identique entre eux, les choses ne deviennent intéressantes que lorsque vous devez combiner différents tests avec des opérations logiques AND / OR / NOT.

En bash, contrairement à [ , [[ empêche le fractionnement de mots de valeurs variables.

La différence la plus importante sera la clarté de votre code. Oui, oui, ce qui a été dit ci-dessus est vrai, mais [[]] aligne votre code sur ce que vous attendez dans les langages de haut niveau, particulièrement en ce qui concerne AND ( && ), OR ( || ) et NOT ( ! ) les opérateurs. Ainsi, lorsque vous vous déplacez entre les systèmes et les langages, vous pourrez interpréter le script plus rapidement, ce qui vous facilitera la vie. Obtenez le Nitty Gritty à partir d’une bonne référence UNIX / Linux. Vous trouverez peut-être que certains détails vous seront utiles dans certaines circonstances, mais vous apprécierez toujours le code clair ! Quel fragment de script préférez-vous lire? Même hors contexte, le premier choix est plus facile à lire et à comprendre.


 if [[ -d $newDir && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]] then ... 

ou

 if [ -d "$newDir" -a -n $(echo "$newDir" | grep "^${webRootParent}") -a -n $(echo "$newDir" | grep '/$') ] then ...