542 votes

Ce qui ' la différence entre [et [[en bash ?

J’ai regardé la page de man de bash et la dit qu’il utilise des Expressions conditionnelles. Puis j’ai regardé à la section Expressions conditionnelles et il énumère les mêmes opérateurs comme (et `` ).

Alors je me demande, quelle est la différence entre et en bash ?

809voto

John Kugelman Points 108754

[[ est bash de l'amélioration de l' [ commande. Il dispose de plusieurs améliorations, pour en faire un meilleur choix si vous écrivez des scripts qui cible bash. Mes favoris sont:

  1. C'est un syntaxique caractéristique de la coque, de sorte qu'il a des comportement qu' [ n'ont pas. Vous n'avez plus à citer les variables comme des fous parce qu' [[ poignées vide de cordes et de chaînes de caractères avec des espaces de manière plus intuitive. Par exemple, avec [ vous devez écrire

    if [ -f "$FILE" ]
    

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

    if [[ -f $FILE ]]
    
  2. Parce que c'est une fonction syntaxique, il vous permet d'utiliser && et || opérateurs pour les tests booléens et < et > pour les comparaisons de chaînes. [ ne peuvent pas le faire parce que c'est une commande régulière et &&, ||, <, et > ne sont pas transmises régulièrement des commandes en tant qu'arguments de ligne de commande.

  3. Il a un merveilleux =~ de l'opérateur pour faire de l'expression régulière correspond. Avec [ vous pouvez écrire

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

    Avec [[ vous pouvez écrire ce que

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

    Il vous permet même d'accéder à la phase de groupes qu'il stocke en BASH_REMATCH. Par exemple, ${BASH_REMATCH[1]} serait "es" si vous avez tapé un "oui" ci-dessus.

  4. Vous obtenez pattern matching aka expansion pour gratuit. Vous êtes peut-être moins strictes sur la façon de taper oui. Peut-être que vous êtes d'accord si l'utilisateur y-quoi que ce soit. Que vous êtes couvert:

    if [[ $ANSWER = y* ]]
    

Gardez à l'esprit que c'est un bash extension, donc si vous écrivez sh-compatible scripts alors vous avez besoin de coller avec [. Assurez-vous d'avoir l' #!/bin/bash ligne shebang pour votre script si vous utilisez deux crochets.

Voir aussi

48voto

Walter Mundt Points 9160
  • [ est le même que l' test builtin, et fonctionne comme l' test binaire (homme test)
    • fonctionne sur le même que [ dans tous les autres poissons à base de coquilles dans de nombreux environnements UNIX
    • prend en charge uniquement une seule condition. Plusieurs tests avec le bash && et || opérateurs doivent être dans des crochets.
    • ne pas nativement en charge d'un " pas " de l'opérateur. Pour inverser une condition, utiliser un ! à l'extérieur de la première tranche de l'utilisation de la coquille de l'établissement pour l'inversion de commande les valeurs de retour.
    • == et != sont de chaîne littérale des comparaisons
  • [[ est un bash
    • est-bash-spécifique, bien que d'autres coquilles peuvent avoir mis en œuvre d'autres constructions similaires. Ne vous attendez pas à un vieux de la vieille école UNIX sh.
    • == et != s'applique bash modèle de règles de correspondance, voir "filtrage" en man bash
    • a un =~ regex match de l'opérateur
    • permet d'utiliser les parenthèses et l' !, &&, et || opérateurs logiques dans les crochets de combiner les sous-expressions

A côté de cela, ils sont assez semblables, la plupart des tests individuels sont identiques entre eux, les choses ne devient intéressant lorsque vous avez besoin de combiner différents tests avec des logiques ET/OU/PAS d'opérations.

27voto

Anthony Rutledge Points 280

La différence la plus importante sera la clarté de votre code. Oui, oui, ce qui a été dit ci-dessus est vrai, mais [[ ]] apporte à votre code en ligne avec ce que vous attendez de haut niveau des langues, en particulier en ce qui concerne ET (&&), OU (||), et non PAS (!) des opérateurs. Ainsi, lorsque vous vous déplacez entre les systèmes et les langues que vous serez en mesure d'interpréter script plus rapide, ce qui rend votre vie plus facile. Obtenir les tenants et aboutissants d'une bonne UNIX/Linux de référence. Vous trouverez peut-être des choses sérieuses pour être utile dans certains cas, mais il vous sera toujours reconnaissant clair code! Qui 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 ...

7voto

Xavier V. Points 1351

En bash, contrairement à [, [[empêche mot partage de valeurs de variables.

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