Come verificare se una variabile è uguale a un numero nella shell


12

Ho questo script di shell che non funziona.

Ingresso:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

Produzione:

Server Name is 1

Ma, se cambio Server_Name=2, l'output è:

Server Name is 1

Quando cambio Server_Namea 2, lo voglio dire: Server Name is 2.

So che è la if [ $Server_Name=1 ];parte.

come lo aggiusto?


Come David sottolinea di seguito, è necessario utilizzare "-eq" per testare i valori numerici. È inoltre possibile verificare la presenza di una variabile vuota per evitare errori; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock,

Risposte:


21

Lo script indica che stai utilizzando confronti di stringhe.

Supponiamo che il nome del server possa essere una stringa anziché solo un numero.

Per i confronti di stringhe :
if [[ "$Server_Name" == 1 ]]; then

Appunti:

  • La spaziatura intorno a == è un must
  • La spaziatura intorno a = è un must
    if [ $Server_Name=1 ]; then è SBAGLIATA

  • [[...]] riduce gli errori poiché non si verifica l'espansione del percorso o la suddivisione delle parole tra [[e]]

  • Preferisci citare stringhe che sono "parole"

Per confronti tra numeri interi :
if [[ "$Server_Name" -eq 1 ]]; then


Maggiori informazioni:


2
[[è la sintassi bash e l'OP stava chiedendo della shell, dove non avrebbe funzionato
gilad mayani,

5

Prova questo:

if [ $Server_Name -eq 1 ];then

2
[ $Server_Name=1 ]

non funziona come previsto perché la sintassi all'interno delle parentesi singole non è speciale per Bash. Come al solito, la variabile $Server_Nameviene sostituita da 1, quindi tutto il comando test ( [) vede è un singolo argomento: la stringa 1=1. Poiché quella puntura ha una lunghezza diversa da zero, il test restituisce true .

Per le shell conformi a POSIX, è possibile utilizzare i seguenti comandi di prova :

[ "$Server_Name" = 1 ]

checks è il $Server_Nameè uguale alla stringa 1.

[ "$Server_Name" -eq 1 ]

controlla è $Server_Nameuguale al numero 1 , ovvero esegue un confronto numerico anziché un confronto di stringhe.

Il valore di ritorno dei due comandi sarà diverso, ad esempio, se definito Server_Name=01. Il primo restituirà false, il secondo restituirà true.

Si noti che se esiste la possibilità che la variabile $Server_Namenon sia definita, deve essere quotata o il test visualizzerà un errore quando richiamato.


1

Provare,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

produzione:

 #./scriptname.sh
 Server Name is below 50

0

Semplice risposta. Il tuo codice è corretto - quasi. l'unica cosa che ti manca sono gli spazi ... (e forse un extra "=")

if [ $Server_Name=1 ]; then

non verrà calcolato correttamente.

if [ $Server_Name == 1 ]; then  

è quello che cerchi.

E ora l'affermazione sulla stringa contro i numeri. Ogni volta che stai cercando un confronto come is / is-not, allora == andrà sempre bene.

E suppongo che tu abbia sempre un nome server come stringa, non un numero - giusto? ;-)

Buona fortuna con il tuo robusto apprendista programmatore.

Ciao


Incredibili così tante risposte ci sono qui ..
Tobibobi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.