texto - recorrer string bash
ComparaciĆ³n de cadenas en bash.[[: extraviado (6)
Estoy tratando de comparar cadenas en bash. Ya encontré una respuesta sobre cómo hacerlo en stackoverflow . En el script que estoy intentando, estoy usando el código enviado por Adam en la pregunta mencionada:
#!/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
También probé el enfoque de ubuntuforums que puedes encontrar en la segunda publicación
if [[ $var =~ regexp ]]; then
#do something
fi
En ambos casos recibo un error:
[[: not found
¿Qué estoy haciendo mal?
¿Cómo está ejecutando su script? Si lo hiciste con
$ sh myscript
Deberías intentarlo:
$ bash myscript
o, si el script es ejecutable:
$ ./myscript
sh y bash son dos conchas diferentes . Mientras que en el primer caso está pasando su guión como argumento al intérprete de sh, en el segundo caso usted decide en la primera línea qué intérprete será utilizado.
Como @Ansgar mencionó, [[
es un bashismo, es decir, está integrado en Bash y no está disponible para otros proyectiles. Si desea que su script sea portátil, use [
. Las comparaciones también necesitarán una sintaxis diferente: cambiar ==
a =
.
Es la primera línea en tu script:
#!/bin/bash
o
#!/bin/sh
sh shell produce estos mensajes de error, no bash
Especifique bash en lugar de sh cuando ejecute el script. Personalmente noté que son diferentes en Ubuntu 12.10:
bash script.sh arg0 ... argn
Tuve este problema al instalar Heroku Toolbelt
Así es como resolví el problema
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash
Como puede ver, / bin / sh es un enlace a "dash" (no bash), y [[
es sugarness sintáctico bash. Así que acabo de reemplazar el enlace a / bin / bash. ¡Tenga cuidado al usar rm como este en su sistema!
$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh
[[
es un bash-builtin. Tu /bin/bash
no parece ser un bash real.