Cómo probar si una variable es igual a un número en el shell


12

Tengo este script de shell que no funciona.

Entrada:

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

Salida:

Server Name is 1

Pero, si cambio Server_Name=2, la salida es:

Server Name is 1

Cuando cambio Server_Namea 2, lo quiero decir: Server Name is 2.

Sé que es la if [ $Server_Name=1 ];parte.

¿Cómo lo soluciono?


Como David señala a continuación, debe usar "-eq" para probar los valores numéricos. También es posible que desee verificar una variable en blanco para evitar errores; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Respuestas:


21

Su secuencia de comandos indica que está utilizando comparaciones de cadenas.

Suponga que el nombre del servidor podría ser una cadena en lugar de un número solamente.

Para comparaciones de cadenas :
if [[ "$Server_Name" == 1 ]]; then

Notas:

  • Espaciar alrededor == es imprescindible
  • Espaciar alrededor = es imprescindible
    if [ $Server_Name=1 ]; then es INCORRECTO

  • [[...]] reduce los errores ya que no hay expansión de nombre de ruta o división de palabras entre [[y]]

  • Prefiere las comillas que son "palabras"

Para comparaciones de enteros :
if [[ "$Server_Name" -eq 1 ]]; then


Más información:


2
[[es la sintaxis bash y el OP preguntaba sobre shell, dónde no funcionaría
gilad mayani


2
[ $Server_Name=1 ]

no funciona según lo previsto porque la sintaxis dentro de los corchetes individuales no es especial para Bash. Como de costumbre, la variable $Server_Namese sustituye por 1, por lo que todo el comando test ( [) ve un solo argumento: la cadena 1=1. Como esa picadura tiene una longitud distinta de cero, la prueba devuelve verdadero .

Para shells compatibles con POSIX, puede usar los siguientes comandos de prueba :

[ "$Server_Name" = 1 ]

comprueba es el $Server_Namees igual a la cadena 1.

[ "$Server_Name" -eq 1 ]

comprueba si es $Server_Nameigual al número 1 , es decir, hace una comparación numérica en lugar de una comparación de cadenas.

El valor de retorno de los dos comandos será diferente, por ejemplo, si lo define Server_Name=01. El primero devolverá falso, el segundo devolverá verdadero.

Tenga en cuenta que si existe la posibilidad de que la variable $Server_Nameno esté definida, se debe citar o la prueba mostrará un error cuando se invoque.


1

Tratar,

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

salida:

 #./scriptname.sh
 Server Name is below 50

0

Respuesta simple Su código es correcto, casi. lo único que falta son los espacios ... (y bueno quizás un "=" extra)

if [ $Server_Name=1 ]; then

No se calculará correctamente.

if [ $Server_Name == 1 ]; then  

es lo que buscas.

Y ahora la declaración sobre cadena versus números. Siempre que busque una comparación como is / is-not, entonces == siempre estará bien.

Y supongo que siempre tiene un nombre de servidor como una cadena, no un número, ¿verdad? ;-)

Buena suerte con tu fuerte aprendiz de codificación.

Chao


Hay tantas respuestas increíbles aquí.
Tobibobi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.