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 --version
imprime?[
no funcionará en este caso, porque no admite patrones.Respuestas:
[[
es un bash-builtin. Tu/bin/bash
no parece ser una fiesta real.De un comentario:
Agregar
#!/bin/bash
en la parte superior del archivofuente
/bin/bash -c "type [["
?#!/bin/bash
en la parte superior de mi archivosh
mucha 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/sh
emula un shell Bourne donde[[
no está integrado. Sin embargo, ejecutar el script vía./script.sh
no debería producir un error, porque en ese caso el shebang debería hacer/bin/bash
que 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
sh
para su distribución es mal aconsejado en mi humilde opinión. Un shell con el que se ejecutash
debería funcionardash
; si no es así, eso es un error en el guión. Si necesitabash
funciones, 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 ... argn
fuente