2012-03-12 19 views
20

Soy muy nuevo en bash scripting y me encuentro con un problema cuando uso doble paréntesis. Parece que no puedo hacer que funcionen en Ubuntu Server 11.10. Mi script a continuación está en if_test.sh.bash double bracket issue

#!/bin/bash 

if [[ "14"=="14" ]]; then 
    echo "FOO" 
fi 

Cuando ejecuto este simple script de shell la salida que recibo es: if_test.sh: 5: [[: No se ha encontrado

Parece que estoy corriendo GNU fiesta de la versión 4.2.10 después de correr bash --versión desde la terminal. Cualquier ayuda sería muy apreciada. ¡Gracias!

+0

Por cierto, sin los espacios, esto no está comparando '14' a' 14', está comprobando si la cadena '14 == 14' está vacía. Daría exactamente el mismo resultado con '[[" 11 "==" 99 "]]', ya que esa cadena tampoco está vacía. –

Respuesta

35

El problema radica en la invocación de su script. Estás emisión:

$ sudo sh if_test.sh 

En los sistemas de Ubuntu, /bin/shis dash, not bash y dash no admite la palabra clave soporte doble (o no lo hizo en el momento de esta publicación, no tengo comprobó dos veces). Usted puede resolver su problema mediante la invocación explícita bash lugar:

$ sudo bash if_test.sh 

Como alternativa, puede hacer que su script ejecutable y se basan en la shebang line:

$ chmod +x if_test.sh 
$ sudo ./if_test.sh 

También tenga en cuenta que, cuando se utiliza entre dobles corchetes, == es un pattern matching operator, no el operador de igualdad. Si desea comprobar la igualdad, puede utilizar -eq:

if [[ "14" -eq "14" ]]; then 
    echo "FOO" 
fi 

O double parentheses:

if ((14 == 14)); then 
    echo "FOO" 
fi 
+0

Cuando intento [["14" -eq "14"]] sigo recibiendo el mismo error. –

+0

Extraño, la palabra clave '[[' ha sido soportada desde la versión 2.02 de 'bash'. ¿Cómo estás ejecutando tu script? Tal vez termine usando un shell diferente ... –

+0

Lo estoy ejecutando con: sudo sh if_test.sh –

6

Puesto que usted es nuevo en secuencias de comandos, que pueden no ser conscientes de que es un [[ del bash. Puede que ni siquiera sepas qué es un bashismo, pero las dos respuestas dadas hasta el momento te están guiando por un camino hacia un futuro de guiones atrofiado promoviendo su uso.

Para comprobar si una variable coincide con una cadena en cualquier sabor de shell de Bourne, puede hacer test $V = 14 Si desea comparar números enteros, use test $V -eq 14. La única diferencia es que este último generará un error si $ V no parece un entero. Hay buenas razones para citar la variable (test "$V" = 14), pero las comillas a menudo son innecesarias y creo que son la causa raíz de una confusión común, ya que "14"=="14" es idéntico a "14==14" donde es más obvio que '==' no se está utilizando como un operador.

hay varias cosas a tener en cuenta: utilizar un único '=' en lugar de '==' porque no todas las conchas reconocen '==', el comando [ es idéntica a test pero requiere un argumento final de ] y muchos sh las pautas de codificación recomiendan usar test porque a menudo genera un código más comprensible, [[ solo es reconocido por un número limitado de shells (este es su problema principal, ya que su shell no parece reconocer [[ y está buscando un comando de ese nombre. es sorprendente si su shebang realmente especifica /bin/bash en lugar de /bin/sh).

4

Mi respuesta no se aplica a @ pregunta de lots_of_questions específicamente, pero también puede encontrarse con este problema si tiene el especificador equivocado en la parte superior de la secuencia de comandos:

#!/bin/sh 
if [[ ... ]] 
... 

debería cambiar eso a

#!/bin/bash 
if [[ ... ]] 
...