Jak sprawdzić, czy zmienna jest równa liczbie w powłoce

13

Mam ten skrypt powłoki, który nie działa.

Wejście:

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

Wynik:

Server Name is 1

Ale jeśli zmienię Server_Name=2, wynik będzie:

Server Name is 1

Kiedy zmieni Server_Namesię 2, chcę powiedzieć: Server Name is 2.

Wiem, że to if [ $Server_Name=1 ];część.

Jak to naprawić?

użytkownik2649805
źródło
Jak David wskazuje poniżej, musisz użyć „-eq”, aby przetestować wartości liczbowe. Możesz także sprawdzić pustą zmienną, aby uniknąć błędów; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
mikebabcock

Odpowiedzi:

22

Twój skrypt wskazuje, że używasz porównań ciągów.

Załóżmy, że nazwa serwera może być ciągiem zamiast liczby.

Dla porównań ciągów :
if [[ "$Server_Name" == 1 ]]; then

Uwagi:

  • Odstęp około == jest koniecznością
  • Odstęp wokół = jest koniecznością
    if [ $Server_Name=1 ]; then jest NIEPRAWIDŁOWY

  • [[...]] zmniejsza liczbę błędów, ponieważ między [[a]] nie dochodzi do rozwijania nazw ani dzielenia wyrazów

  • Preferuj ciągi znaków, które są „słowami”

Dla porównań liczb całkowitych :
if [[ "$Server_Name" -eq 1 ]]; then


Więcej informacji:

Ivan Chau
źródło
2
[[to składnia bash, a OP pytał o powłokę, w której to by nie działało
gilad mayani
5

Spróbuj tego:

if [ $Server_Name -eq 1 ];then
Dave.d
źródło
2
[ $Server_Name=1 ]

nie działa zgodnie z przeznaczeniem, ponieważ składnia w pojedynczych nawiasach nie jest wyjątkowa dla Bash. Jak zwykle zmienna $Server_Namezostaje podstawiona przez 1, więc wszystkie polecenia test ( [) są jednym argumentem: ciągiem znaków 1=1. Ponieważ żądło ma niezerową długość, test zwraca true .

W przypadku powłok zgodnych z POSIX można użyć następujących poleceń testowych :

[ "$Server_Name" = 1 ]

sprawdza, czy $Server_Namejest równy ciągowi 1.

[ "$Server_Name" -eq 1 ]

sprawdza, czy $Server_Namejest równe liczbie 1 , tzn. dokonuje porównania numerycznego zamiast porównania ciągu.

Zwracana wartość obu poleceń będzie się różnić, np. Jeśli zdefiniujesz Server_Name=01. Pierwszy zwróci fałsz, drugi zwróci prawdę.

Zauważ, że jeśli istnieje możliwość, że zmienna $Server_Namejest niezdefiniowana, należy ją podać lub test wyświetli błąd po jej wywołaniu.

Dennis
źródło
1

Próbować,

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

wynik:

 #./scriptname.sh
 Server Name is below 50
Ranjithkumar T.
źródło
0

Prosta odpowiedź. Twój kod jest poprawny - prawie. jedyne, czego brakuje, to spacje ... (i może dodatkowe „=”)

if [ $Server_Name=1 ]; then

nie będzie poprawnie obliczany.

if [ $Server_Name == 1 ]; then  

jest tym, czego szukasz.

A teraz stwierdzenie o sznurku a liczbach. Ilekroć szukasz porównania takiego jak jest / nie jest, wtedy == zawsze będzie dobrze.

Zakładam, że zawsze masz nazwę serwera jako ciąg, a nie liczbę - prawda? ;-)

Powodzenia z solidnym uczniem kodującym.

cześć

Tobibobi
źródło
Niesamowite jest tyle odpowiedzi, które są tutaj ...
Tobibobi,