Como testar se uma variável é igual a um número no shell


12

Eu tenho esse script de shell que não está funcionando.

Entrada:

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

Resultado:

Server Name is 1

Mas, se eu mudar Server_Name=2, a saída é:

Server Name is 1

Quando eu mudar Server_Namepara 2, eu quero dizer: Server Name is 2.

Eu sei que é a if [ $Server_Name=1 ];parte.

Como faço para corrigir isso?


Como David aponta abaixo, você deve usar "-eq" para testar valores numéricos. Você também pode procurar uma variável em branco para evitar erros; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Mikebabcock

Respostas:


21

Seu script indica que você está usando comparações de strings.

Suponha que o nome do servidor possa ser uma sequência em vez de apenas um número.

Para comparações de strings :
if [[ "$Server_Name" == 1 ]]; then

Notas:

  • Espaçar em torno de == é uma obrigação
  • Espaçar ao redor = é uma obrigação
    if [ $Server_Name=1 ]; then está ERRADO

  • [[...]] reduz erros, pois não ocorre expansão de nome de caminho ou divisão de palavras entre [[e]]

  • Prefira citar cadeias de caracteres que são "palavras"

Para comparações de números inteiros :
if [[ "$Server_Name" -eq 1 ]]; then


Mais Informações:


2
[[é a sintaxe bash e o OP foi perguntando sobre shell, onde ele não iria funcionar
gilad Mayani

5

Tente o seguinte:

if [ $Server_Name -eq 1 ];then

2
[ $Server_Name=1 ]

não funciona conforme o esperado, porque a sintaxe dentro dos colchetes únicos não é especial para o Bash. Como sempre, a variável $Server_Nameé substituída por 1, então todo o comando test ( [) vê um único argumento: a string 1=1. Como essa picada tem um comprimento diferente de zero, o teste retorna verdadeiro .

Para shells compatíveis com POSIX, você pode usar os seguintes comandos de teste :

[ "$Server_Name" = 1 ]

cheques é $Server_Nameigual a sequência 1.

[ "$Server_Name" -eq 1 ]

cheques é $Server_Nameigual ao número 1 , ou seja, ele faz uma comparação numérica em vez de uma comparação de cadeias.

O valor de retorno do comando dois será diferente, por exemplo, se você definir Server_Name=01. O primeiro retornará falso, o segundo retornará verdadeiro.

Observe que, se existe a possibilidade de a variável não $Server_Nameser definida, ela deve ser citada ou o teste exibirá um erro quando invocado.


1

Tentar,

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

resultado:

 #./scriptname.sh
 Server Name is below 50

0

Resposta simples. Seu código está correto - quase. a única coisa que falta são espaços ... (e talvez um extra "=")

if [ $Server_Name=1 ]; then

não irá calcular corretamente.

if [ $Server_Name == 1 ]; then  

é o que você procura.

E agora a afirmação sobre string versus números. Sempre que você estiver procurando por comparação como é / não é, == sempre estará bem.

E eu presumo que você sempre tenha um nome de servidor como uma string, não um número - certo? ;-)

Boa sorte com seu aprendiz robusto de codificação.

tchau


Incríveis tantas respostas que existem aqui .. #
Tobibobi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.