J'essaye de comparer des 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'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 aussi 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 mal?
bash
shell
ubuntu-11.04
string-comparison
user1581900
la source
la source
/bin/bash --version
impression?[
ne fonctionnera pas dans ce cas, car il ne prend pas en charge les modèles.Réponses:
[[
est un bash-builtin. Votre/bin/bash
ne semble pas être une véritable bash.À partir d'un commentaire:
Ajouter
#!/bin/bash
en haut du fichierla source
/bin/bash -c "type [["
?#!/bin/bash
en haut de mon fichiersh
beaucoup de frustration. Il ne me reste plus qu'à refaire tout ce que j'ai annulé avant de trouver cette réponse.Comment exécutez-vous votre script? Si vous avez fait avec
tu devrais essayer:
ou, si le script est exécutable:
sh et bash sont deux coquilles différentes . 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 de l'interpréteur qui sera utilisé.
la source
sh myscript.sh
, car/bin/sh
émule un Bourne shell où[[
n'est pas un shell intégré. Cependant, l'exécution du script via./script.sh
ne doit pas générer d'erreur, car dans ce cas, le shebang doit/bin/bash
être utilisé.Est la première ligne de votre script:
ou
le sh shell produit ces messages d'erreur, pas bash
la source
J'ai eu ce problème lors de l'installation de Heroku Toolbelt
C'est ainsi que j'ai résolu le problème
Comme vous pouvez le voir, / 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. Attention à utiliser rm comme ça dans votre système!la source
sh
par défaut de votre distribution est mal avisé à mon humble avis. Un shell qui est exécuté avecsh
devrait fonctionner avecdash
; si ce n'est pas le cas, c'est un bogue dans le script. Si vous avez besoin debash
fonctionnalités, utilisezbash
, nonsh
.update-alternatives
(dans Linux basé sur Debian) comme ceci justinconover.wordpress.com/2012/05/14/... mais à la fin, ce serait la même chose.Comme @Ansgar l'a mentionné,
[[
est un bashisme, c'est-à-dire intégré à Bash et non disponible pour d'autres shells. Si vous souhaitez que votre script soit portable, utilisez[
. Les comparaisons nécessiteront également une syntaxe différente: remplacez==
par=
.la source
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
la source