2010-03-01 16 views
33

No estoy seguro de cómo hacer un if con múltiples pruebas en shell. Estoy teniendo problemas para escribir este guión:Usando if elif fi en shell scripts

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" && "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 && $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

El problema se me sale este error cada vez que:

./compare.sh: [: falta `] comando' no encontrado

+5

Bastantes comentaristas han sugerido que use [[en lugar de [pero eso hace que su script sea específico de bash. Tendrá menos problemas de mantenimiento y portabilidad si puede seguir con la sintaxis anterior de Bourne shell (sh). –

Respuesta

25

sh está interpretando el && como operador de la cáscara. Cambiarlo a -a, eso es [ ‘s operador de conjunción:

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] 

Además, siempre hay que citar las variables, debido a [ se confunde cuando salga fuera argumentos.

5

Cambia "[" a "[[" y "]" a "]]".

+1

Mejor aún, cambie '[' a 'prueba' –

7

Use corchetes dobles ...

if [[ expression ]]

+1

Para tener en cuenta, esta es una solución porque '' ['constructo está integrado en el shell mientras' ['es otro nombre para el comando' test' y por lo tanto está sujeto a su sintaxis - ver 'prueba de hombre' –

+4

Técnicamente,' ['es una shell incorporada, pero' [['es una palabra clave de shell. Esa es la diferencia. –

+1

Así que vea los resultados de los comandos bash 'type [', 'type [[', 'help [' and 'help [['. – Apostle

2

Tengo un ejemplo de su código. Pruebe esto:

echo "*Select Option:*" 
echo "1 - script1" 
echo "2 - script2" 
echo "3 - script3 " 
read option 
echo "You have selected" $option"." 
if [ $option="1" ] 
then 
    echo "1" 
elif [ $option="2" ] 
then 
    echo "2" 
    exit 0 
elif [ $option="3" ] 
then 
    echo "3" 
    exit 0 
else 
    echo "Please try again from given options only." 
fi 

Esto debería funcionar. :) respuesta

+0

Gawd esto me parece peculiar. ¿Por qué no 'then' after' else'? Puede que en realidad no sea peculiar, pero así es como se ve, en comparación con C. – Rolf

+0

se requiere espacio después de $ option y before = para ejecutarlo bien, de lo contrario cada vez 1 – PiyusG

23

Josh de Lee funciona, pero se puede utilizar el operador "& &" para una mejor legibilidad de esta manera:

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 
1

Esto es trabajo para mí,

# cat checking.sh 
#!/bin/bash 
echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 == $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

# ./checking.sh 
You have provided the following arguments 
All of the specified args are equal 

Puede añadir "set -x" en la secuencia de comandos para solucionar los errores,

Gracias.

Cuestiones relacionadas