web-dev-qa-db-fra.com

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

J'essaie de comparer les chaînes dans Bash. J'ai déjà trouvé une réponse sur la façon de le faire sur stackoverflow . Dans le script que j'essaye, 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 aussi essayé l'approche de buntuforums 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 mal?

130
user1581900

[[ est intégré à bash. Votre /bin/bash ne semble pas être une bash réelle.

120
Ansgar Wiechers

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

$ sh myscript

tu devrais essayer:

$ bash myscript

ou, si le script est exécutable:

$ ./myscript

sh et bash sont deux coques différentes . Alors que dans le premier cas, vous transmettez votre script en tant qu'argument à l'interpréteur sh, dans le second cas, vous décidez de la première ligne quel interprète sera utilisé.

149
Akos K

Est-ce que la première ligne de votre script:

#!/bin/bash

ou

#!/bin/sh

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

75
Wiley

J'ai eu ce problème lors de l'installation Heroku Toolbelt

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 constater,/bin/sh est un lien vers "dash" (pas bash), et [[ est un sucre syntaxique bash. Je viens donc de remplacer le lien vers/bin/bash. Faites attention en utilisant rm comme ceci dans votre système!

$ Sudo rm /bin/sh
$ Sudo ln -s /bin/bash /bin/sh
14
jperelli

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

8
Amedee Van Gasse

Spécifiez bash au lieu de sh lors de l'exécution du script. J'ai personnellement remarqué qu'ils sont différents sous Ubuntu 12.10:

bash script.sh arg0 ... argn

3
Smeterlink