2012-06-01 16 views
103

Estoy usando shell SH y estoy tratando de comparar una cadena con el valor de una variable, pero la condición if siempre se ejecuta en verdadero. ¿Por qué?Comparar una cadena en Unix

Aquí hay un código:

Sourcesystem="ABC" 

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

Incluso esto no está funcionando:

Sourcesystem="ABC" 

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

En segundo lugar, podemos coincidir esto con un valor NULL o una cadena vacía?

+0

Primero en Bourne shell que no necesita el extra ';' Cuando pruebo ejecutar el script en el shell Bourne, la condición if es falsa. En primer lugar dará una advertencia: [: ABC: expresión entera esperada. El resultado es: "El sistema de origen NO coincide con ABC". Como comentaron otros, -eq se usa para comparaciones enteras. Use un signo igual para la comparación de cadenas en shell Bourne (#!/Bin/sh). Tu caparazón debería haberte corregido en primer lugar. –

Respuesta

46

-eq se utiliza para comparar enteros. Use = en su lugar.

167

se debe utilizar el operador de comparación de cadenas =:

Sourcesystem="ABC" 

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

man test dice que utilice -z coincidir para cadenas vacías.

+1

No es necesario citar 'ABC' o' XYZ'. – ceving

+8

Si su variable puede tener espacios en ella, entonces es necesario citar. –

+0

Ajustó el ejemplo para aclarar esa parte @WilliamEverett. –

5

-eq es un operador de comparación matemática. Nunca lo he usado para comparar cuerdas, confiando en == y != para comparar.

if [ 'XYZ' == 'ABC' ]; then # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both 
    echo "Match" 
else 
    echo "No Match" 
fi 
+5

Tenga en cuenta que el operador '==' no funciona en todos los shell. '=' es el operador correcto que se debe usar para comparar cadenas, y '==' a veces es un sinónimo. –

3

-eq es el operador de comparación shell para comparar números enteros. Para comparar cadenas necesita usar =.

+6

-1: No use '=='. Solo es válido en un conjunto limitado de proyectiles y producirá un comportamiento no especificado. –

1

De las 4 shells que he probado, ABC -eq XYZ se evalúa como verdadero en el test incorporado para zsh y ksh. La expresión se evalúa como falsa en /usr/bin/test y los builtins para dash y bash. En ksh y zsh, las cadenas se convierten en valores numéricos y son iguales ya que ambas son 0. IMO, el comportamiento de las instrucciones para ksh y zsh es incorrecto, pero la especificación para test es ambigua en esto.

+0

Gracias por probar. Es por eso que el shell Bourne es popular. –

11

tenía este mismo problema, haga lo siguiente

if [ 'xyz' = 'abc' ]; 
then 
echo "match" 
fi 

Aviso el espacio en blanco. Es importante que utilice un espacio en blanco en este caso después y antes del signo =.

Revisa "Other Comparison Operators".

+1

en Dockerfile:/bin/sh: 1: [: =: operador inesperado – holms

6

eq se utiliza para comparar números enteros utilizan igual '=' lugar, ejemplo:

if [ 'AAA' = 'ABC' ]; 
then 
    echo "the same" 
else 
    echo "not the same" 
fi 

buena suerte

Cuestiones relacionadas