GNU/Linux >> Tutoriels Linux >  >> Linux

La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

Y a-t-il une différence entre ces deux.

[[ $a == z* ]]

et

[ $a == z* ] 

Puis-je avoir un exemple où ils auraient des sorties différentes ?

De plus, comment fonctionne [[ ]] diffère de [ ] ?

Réponse acceptée :

La différence entre [[ … ]] et [ … ] est principalement couvert dans Pourquoi l'expansion des paramètres avec des espaces sans guillemets fonctionne-t-elle à l'intérieur de crochets doubles "[[" mais pas à l'intérieur de crochets simples "[" ?.
Fondamentalement, [[ … ]] est une syntaxe spéciale, alors que [ est un nom amusant pour une commande. [[ … ]] a des règles de syntaxe spéciales pour ce qui est à l'intérieur, [ … ] non.

Avec l'ajout d'un caractère générique, voici comment [[ $a == z* ]] est évalué :

  1. Parser la commande :il s'agit du [[ … ]] construction conditionnelle autour de l'expression conditionnelle $a == z* .
  2. Parser l'expression conditionnelle :c'est le == opérateur binaire, avec les opérandes $a et z* .
  3. Développez le premier opérande dans la valeur de la variable a .
  4. Évaluer le == opérateur :teste si la valeur de la variable a correspond au motif z* .
  5. Évaluez l'expression conditionnelle :son résultat est le résultat de l'opérateur conditionnel.
  6. La commande est maintenant évaluée, son statut est 0 si l'expression conditionnelle était vraie et 1 si elle était fausse.

Voici comment [ $a == z* ] est évalué :

  1. Parser la commande :c'est le [ commande avec les arguments formés en évaluant les mots $a , == , z* , ] .
  2. Développez $a dans la valeur de la variable a .
  3. Effectuer le fractionnement de mots et la génération de noms de fichiers sur les paramètres de la commande.
    • Par exemple, si la valeur de a est la chaîne de 6 caractères foo b* (obtenu par exemple par a='foo b*' ) et la liste des fichiers du répertoire courant est (bar , baz , qux , zim , zum ), alors le résultat du développement est la liste de mots suivante :[ , foo , bar , baz , == , zim , zum , ] .
  4. Exécutez la commande [ avec les paramètres obtenus à l'étape précédente.
    • Avec les exemples de valeurs ci-dessus, le [ La commande se plaint d'une erreur de syntaxe et renvoie le statut 2.

Remarque :Dans [[ $a == z* ]] , à l'étape 3, la valeur de a ne subit pas de fractionnement de mots ni de génération de noms de fichiers, car il se trouve dans un contexte où un seul mot est attendu (l'argument de gauche de l'opérateur conditionnel == ). Dans la plupart des cas, si un seul mot a un sens à cette position, l'expansion de la variable se comporte comme elle le fait entre guillemets doubles. Cependant, il existe une exception à cette règle :dans [[ abc == $a ]] , si la valeur de a contient des caractères génériques, puis abc correspond au modèle générique. Par exemple, si la valeur de a est a* puis [[ abc == $a ]] est vrai (car le caractère générique * provenant de l'expansion sans guillemets de $a correspond à bc ) alors que [[ abc == "$a" ]] est faux (parce que le caractère ordinaire * provenant de l'expansion citée de $a ne correspond pas à bc ). À l'intérieur de [[ … ]] , les guillemets doubles ne font aucune différence, sauf sur le côté droit de la chaîne correspondant aux opérateurs (= , == , != et =~ ).

En relation :Imprimer la ligne correspondante et la nième ligne à partir de la ligne correspondante ?
Linux
  1. Quelle est la différence entre InnoDB et MyISAM ?

  2. Quelle est la différence entre Sudo Su - et Sudo Su - ?

  3. La différence entre Getty et Agetty ?

  4. La différence entre .exrc et .vimrc ?

  5. La différence entre '$ . Foo' Et '$ ./foo' ? ?

Quelle est la différence entre Linux et Unix ?

La différence entre Lubuntu et Lxde ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre fsck et e2fsck ?

Quelle est la différence entre ls et l ?