¿Cómo puedo comparar una variable con una cadena de texto, en lugar de un entero, en una instrucción if / else?

24

En el proceso de escribir un script de shell, me encontré con un problema con la siguiente declaración if / else que se encuentra en algún lugar en el medio del script:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

El error de retorno es:

./gitup: line 13: [: add: integer expression expected

y luego continúa con el resto del guión. ¿Cómo puedo hacer que el segmento if evalúe / compare la variable con una entrada de cadena en lugar de un entero? se requirió un error diferente al usar "! =" entre otras cosas que probé.

tony_perkis666
fuente

Respuestas:

38

Algo como esto:

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eqes para comparar números, usar =para comparar cadenas

Gurú
fuente
Gracias. Lo intenté y el script se liberaría, requiriendo una pulsación de tecla, pero descubrí que fue causado por un error de sintaxis no relacionado más abajo, por lo que funcionó perfectamente. Gracias por la ayuda.
tony_perkis666
3
@josephmarhee: Tenga en cuenta que la [[]]prueba es una construcción específica de Bash, y este ejemplo funciona igual de bien con POSIX []como se usa en la pregunta. Si el intérprete se da explícitamente como #!/bin/basho similar, [[]]se puede usar sin problemas (y creo que es un poco más rápido que la alternativa en Bash , no es que sea un cuello de botella de todos modos), de lo contrario uno debería quedarse []. Si uno no necesita detalles específicos de Bash, el script se ejecutará un poco más rápido, por ejemplo, en Dash. Y POSIX asegura la portabilidad inherente.
Daniel Andersson
4

Este método también funcionaría. Muy similar a la respuesta de @ Guru, pero elimina la necesidad de corchetes dobles.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
Yokai
fuente