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

8

Eu tenho este 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

Saída:

Server Name is 1

Mas, se eu alterar Server_Name=2 , a saída será:

Server Name is 1

Quando altero Server_Name para 2 , quero dizer: Server Name is 2 .

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

Como faço para corrigir isso?

    
por user2649805 16.12.2013 / 01:51

5 respostas

15

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

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

Para Comparações de sequências :% if [[ "$Server_Name" == 1 ]]; then

Notas:

  • O espaçamento em torno de == é um deve
  • O espaçamento em torno de = é um must em que if [ $Server_Name=1 ]; then é WRONG

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

  • Prefiro citar cadeias que são "palavras"

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

Mais informações:

por 16.12.2013 / 02:59
3

Tente isto:

if [ $Server_Name -eq 1 ];then
    
por 16.12.2013 / 01:59
1
[ $Server_Name=1 ]

não funciona como esperado porque a sintaxe dentro dos colchetes não é especial para o Bash. Como de costume, a variável $Server_Name é substituída por 1, portanto, todo o comando teste ( [ ) vê um único argumento: a string 1=1 . Uma vez que esse sting tem um comprimento diferente de zero, test retorna true .

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

[ "$Server_Name" = 1 ]

verifica se o $Server_Name é igual à string 1 .

[ "$Server_Name" -eq 1 ]

verifica se o $Server_Name é igual ao número 1 , ou seja, faz uma comparação numérica em vez de uma comparação de cadeia de caracteres.

O valor de retorno dos dois comandos 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 que a variável $Server_Name seja indefinida, ela deve ser citada ou teste exibirá um erro quando invocada.

    
por 16.12.2013 / 02:42
1

Tente,

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

saída:

 #./scriptname.sh
 Server Name is below 50
    
por 16.12.2013 / 08:18
0

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

if [ $Server_Name=1 ]; then

não será computado 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 uma comparação como / is-is, então == sempre estará bem.

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

Boa sorte com o seu aprendiz de código.

Ciao

    
por 16.12.2013 / 09:52