Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/05/2010, à 11:05

Postmortem

[Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Salut !

J'ai une question qui me turlupine !!

$ [[ -d toto ]] && echo "Le répertoire toto existe" || echo "Le répertoire toto n'existe pas"
Le répertoire toto n'existe pas

$ [ -d toto ] && echo "Le répertoire toto existe" || echo "Le répertoire toto n'existe pas"
Le répertoire toto n'existe pas

Comme vous pouvez le voir, que l'on fasse le test avec [ ] ou avec [[ ]], le résultat est le même.

Donc quelle est la différence entre les 2 ? Dans quel cas utilise-t-on plutôt l'un que l'autre ??

Je me disais qu'on ne mettait qu'une paire de crochets avec le if mais apparemment, ça ne change pas grand chose :

$ if [ -d toto ]
then echo "Le répertoire toto existe"
else echo "Le répertoire toto n'existe pas"
fi
Le répertoire toto n'existe pas

$ if [[ -d toto ]]
then echo "Le répertoire toto existe"
else echo "Le répertoire toto n'existe pas"
fi
Le répertoire toto n'existe pas

Je sais, je me pose des questions à la con !

Dernière modification par Postmortem (Le 20/05/2010, à 11:19)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#2 Le 20/05/2010, à 11:12

iuchiban

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Salut,

Regarde sur ce site : http://abs.traduc.org/abs-fr/ch07.html

Il existe une commande dédiée appelée [ (caractère spécial crochet gauche). C'est un synonyme de test, qui est intégré pour des raisons d'optimisation. Cette commande considère ses arguments comme des expressions de comparaisons ou comme des tests de fichiers et renvoie un état de sortie correspondant au résultat de la comparaison (0 pour vrai et 1 pour faux).

Avec la version 2.02, Bash a introduit la commande de test étendue [[ ... ]], réalisant des comparaisons d'une façon familière aux programmeurs venant d'autres langages. Notez que [[ est un mot clé, pas une commande.

C'est la même chose mais [[ ]]est plus récent donc à privilégier.


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#3 Le 20/05/2010, à 11:18

Postmortem

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

La vache, réponses supersonic !!!
Merci !!
En effet, avec une seule paire de crochet, le test ne reconnait pas l'opérateur =~ pour comparer avec une expression régulière.
Exemple :

$ toto=azeryty1234
$ [[ $toto =~ ^[0-9]+$ ]] && echo "Que des chiffres" || echo "Autre chose"
Autre chose
$ toto=164468
$ [[ $toto =~ ^[0-9]+$ ]] && echo "Que des chiffres" || echo "Autre chose"
Que des chiffres
$ [ $toto =~ ^[0-9]+$ ] && echo "Que des chiffres" || echo "Autre chose"
bash: [: =~: binary operator expected
Autre chose

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#4 Le 20/05/2010, à 11:19

Postmortem

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Merci iuchiban !
J'avais cru voir une réponse de helly (ou un nom s'en approchant) mais elle est plus là !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 20/05/2010, à 18:27

Hizoka

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Un test avec double crochet :

test="bonjour toi"

if [[ ${test} == "bonjour toi" ]]
then
echo "idem"
fi
=> idem

le meme en simple :

if [ ${test} == "bonjour toi" ]
then
echo "idem"
fi
=> bash: [: trop d'arguments
if [ "${test}" == "bonjour toi" ]
then
echo "idem"
fi
=> idem

là, les doubles crochets évite de devoir mettre des " autour des variables.

if [[ ${test} == "bonjour toi" && ${test} != "salut toi" ]]
then
echo "idem"
fi
if [ "${test}" == "bonjour toi" && "${test}" != "salut toi" ]
then
echo "idem"
fi
=> bash: [: « ] » manquant
if [ "${test}" == "bonjour toi" ] && [ "${test}" != "salut toi" ]
then echo "idem"
fi
=> idem

Encore un autre exemple, impossible de faire plusieurs vérification avec un simple crochet alors que possible avec le double.

En gros il est beaucoup plus souple d'utiliser les doubles crochet.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 20/05/2010, à 20:31

johndo

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Bonsoir,

Hizoka a écrit :

Encore un autre exemple, impossible de faire plusieurs vérification avec un simple crochet alors que possible avec le double.

petite rectification : il est possible d'effectuer une combinaison de conditions avec les simples crochets :

[ a = c -o a = a ] && echo yes

le tout est d'utiliser les bons opérateurs de combinaison (il sont définis dans le man de l'instruction test) wink
A savoir :
-a pour le ET
-o : pour le OU

ils sont également précisés dans le man du bash mais également via info coreutils 'test invocation'

Hors ligne

#7 Le 20/05/2010, à 22:54

Postmortem

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

Re-bonsoir à tous !
C'est ça que j'aime bien ici : on a la réponse à sa question ou à son problème, et en plus, on a la réponse à une autre question qu'on allait se poser !! :-)
MERCI !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 21/05/2010, à 07:31

Hizoka

Re : [Résolu] Différence entre "[ un test ]" et "[[ un test ]]" ???

johndo => je ne le savais pas, merci smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne