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?
bash
shell
ubuntu-11.04
string-comparison
user1581900
fuente
fuente

/bin/bash --versionimprime?[no funcionará en este caso, porque no admite patrones.Respuestas:
[[es un bash-builtin. Tu/bin/bashno parece ser una fiesta real.De un comentario:
Agregar
#!/bin/bashen la parte superior del archivofuente
/bin/bash -c "type [["?#!/bin/bashen la parte superior de mi archivoshmucha frustración. Ahora solo tengo que rehacer todo lo que deshice antes de encontrar esta respuesta.¿Cómo estás ejecutando tu script? Si lo hicieras con
Deberías intentarlo:
o, si el script es ejecutable:
sh y bash son dos conchas diferentes . Mientras que en el primer caso pasa su guión como argumento al intérprete sh, en el segundo caso decide en la primera línea qué intérprete se utilizará.
fuente
sh myscript.sh, porque/bin/shemula un shell Bourne donde[[no está integrado. Sin embargo, ejecutar el script vía./script.shno debería producir un error, porque en ese caso el shebang debería hacer/bin/bashque se use.Es la primera línea en tu script:
o
el shell sh produce estos mensajes de error, no bash
fuente
Tuve este problema al instalar Heroku Toolbelt
Así es como resolví el problema.
Como puede ver, / bin / sh es un enlace a "guión" (no bash), y
[[es azucar sintáctico bash. Así que acabo de reemplazar el enlace a / bin / bash. ¡Tenga cuidado al usar rm como este en su sistema!fuente
shpara su distribución es mal aconsejado en mi humilde opinión. Un shell con el que se ejecutashdebería funcionardash; si no es así, eso es un error en el guión. Si necesitabashfunciones, usebash, nosh.update-alternatives(en debian-based-linux) como este justinconover.wordpress.com/2012/05/14/… pero al final, sería lo mismo.Como @Ansgar mencionó,
[[es un bashism, es decir, integrado en Bash y no está disponible para otros shells. Si quieres que tu script sea portátil, úsalo[. Las comparaciones también necesitarán una sintaxis diferente: cambiar==a=.fuente
Especifique bash en lugar de sh cuando ejecute el script. Personalmente noté que son diferentes en Ubuntu 12.10:
bash script.sh arg0 ... argnfuente