211 votes

Comparaison de chaînes en bash. [[ : non trouvé

J'essaie de comparer des chaînes de caractères en bash. J'ai déjà trouvé une réponse sur comment le faire sur stackoverflow . Dans le script que j'essaie, j'utilise le code soumis par Adam dans la question mentionnée :

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

J'ai également essayé l'approche de ubuntuforums que vous pouvez trouver dans le 2ème post

if [[ $var =~ regexp ]]; then
  #do something
fi

Dans les deux cas, je reçois une erreur :

[[: not found

Qu'est-ce que je fais de mal ?

229voto

Ansgar Wiechers Points 38466

[[ est un bash-builtin. Votre /bin/bash ne semble pas être un vrai bash.

D'après un commentaire :

Ajouter #!/bin/bash en haut du fichier

207voto

akoskm Points 3362

Comment exécutez-vous votre script ? Si vous l'avez fait avec

$ sh myscript

vous devriez essayer :

$ bash myscript

ou, si le script est exécutable :

$ ./myscript

sh y bash sont deux différentes coquilles . Alors que dans le premier cas vous passez votre script comme argument à l'interpréteur sh, dans le second cas vous décidez sur la toute première ligne quel interpréteur sera utilisé.

85voto

Wiley Points 216

Est la première ligne de votre script :

#!/bin/bash

ou

#!/bin/sh

le shell sh produit ces messages d'erreur, pas bash

19voto

Amedee Van Gasse Points 3740

Comme @Ansgar l'a mentionné, [[ est un bashisme, c'est-à-dire intégré à Bash et non disponible pour d'autres shells. Si vous voulez que votre script soit portable, utilisez [ . Les comparaisons auront également besoin d'une syntaxe différente : change == a = .

if [ $MYVAR = "myvalue" ]; then
    echo "true"
else
    echo "false"
fi

17voto

jperelli Points 1072

J'ai eu ce problème lors de l'installation Ceinture d'outils Heroku

Voici comment j'ai résolu le problème

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

Comme vous pouvez le voir, /bin/sh est un lien vers "dash" (et non bash), et [[ est un sucre syntaxique de bash. J'ai donc simplement remplacé le lien vers /bin/bash. Attention à l'utilisation de rm comme ça dans votre système !

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

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