2012-06-01 7 views
103

Sto usando SH shell e sto provando a confrontare una stringa con il valore di una variabile, ma la condizione if è sempre eseguita su true. Perché?Confronta una stringa in Unix

Ecco il codice:

Sourcesystem="ABC" 

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

echo Sourcesystem Value is $Sourcesystem ; 

Anche questo non sta funzionando:

Sourcesystem="ABC" 

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

echo Sourcesystem Value is $Sourcesystem ; 

In secondo luogo, possiamo abbinare questo con un valore NULL o una stringa vuota?

+0

primo a Bourne shell non è necessario l'extra ';' Quando eseguo il test dello script nella shell Bourne, la condizione if è falsa. Daremo prima un avvertimento: [: ABC: espressione intera prevista. L'output è: "Sourcesystem NOT NOT Matched ABC". Come commentato da altri, -eq è usato per confronti tra interi. Utilizzare un singolo segno di uguale per il confronto delle stringhe nella shell Bourne (#!/Bin/sh). Il tuo guscio dovrebbe averti corretto in primo luogo. –

risposta

46

-eq viene utilizzato per confrontare gli interi. Utilizzare invece =.

167

si consiglia di utilizzare l'operatore di = per il confronto stringa:

Sourcesystem="ABC" 

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

man test dice che si utilizza -z corrispondere per le stringhe vuote.

+1

Non è necessario citare "ABC" o "XYZ". – ceving

+8

Se la variabile potrebbe contenere degli spazi, è necessario quotare. –

+0

Aggiustato l'esempio per rendere la parte più chiara @WilliamEverett. –

5

-eq è un operatore di confronto matematico. Non l'ho mai usato per il confronto di stringhe, basandosi su == e != per il confronto.

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

Si noti che l'operatore '==' non funziona su ogni shell. '=' è l'operatore corretto da usare per confrontare le stringhe, e '==' a volte è un sinonimo. –

3

-eq è l'operatore di confronto della shell per il confronto degli interi. Per confrontare le stringhe è necessario utilizzare =.

+6

-1: non utilizzare '=='. È valido solo in un insieme limitato di shell e produrrà un comportamento non specificato. –

1

Delle 4 shell che ho testato, ABC -eq XYZ restituisce true nel test incorporato per zsh e ksh. L'espressione restituisce false sotto /usr/bin/test e i builtin per dash e bash. In ksh e zsh, le stringhe vengono convertite in valori numerici e sono uguali poiché sono entrambe 0. IMO, il comportamento dei builtin per ksh e zsh non è corretto, ma la specifica per test è ambigua su questo.

+0

Grazie per il test. Ecco perché la shell Bourne è popolare. –

11

Ho avuto questo stesso problema, fare questo

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

Avviso gli spazi. È importante utilizzare uno spazio bianco in questo caso dopo e prima del segno =.

Controllare "Other Comparison Operators".

+1

nel file Docker:/bin/sh: 1: [: =: operatore imprevisto – holms

6

eq viene utilizzato per confrontare gli interi utilizzare uguale '=', invece, esempio:

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

buona fortuna