Как проверить, равна ли переменная числу в оболочке


12

У меня есть этот сценарий оболочки, который не работает.

Входные данные:

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

Вывод:

Server Name is 1

Но, если я изменяю Server_Name=2, вывод:

Server Name is 1

Когда я изменяю Server_Nameк 2, я хочу сказать: Server Name is 2.

Я знаю, что это if [ $Server_Name=1 ];часть.

Как мне это исправить?


Как указывает Дэвид ниже, вы должны использовать «-eq» для проверки числовых значений. Вы также можете проверить наличие пустой переменной, чтобы избежать ошибок; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Майкбабкок

Ответы:


21

Ваш скрипт указывает, что вы используете сравнение строк.

Предположим, что имя сервера может быть строкой, а не только числом.

Для сравнения строк :
if [[ "$Server_Name" == 1 ]]; then

Ноты:

  • Интервал == является обязательным
  • Интервал = является обязательным
    if [ $Server_Name=1 ]; then НЕПРАВИЛЬНО

  • [[...]] уменьшает количество ошибок, так как между [[и]] не происходит расширения имени пути или разделения слов.

  • Предпочитаю цитировать строки, которые являются "словами"

Для целочисленных сравнений :
if [[ "$Server_Name" -eq 1 ]]; then


Больше информации:


2
[[это синтаксис bash, и ОП спрашивал о оболочке, где это не сработало
gilad mayani


2
[ $Server_Name=1 ]

не работает должным образом, потому что синтаксис внутри одинарных скобок не является особенным для Bash. Как обычно, переменная $Server_Nameзаменяется на 1, поэтому вся команда test ( [) видит один аргумент: строку 1=1. Поскольку эта строка имеет ненулевую длину, test возвращает true .

Для POSIX-совместимых оболочек вы можете использовать следующие тестовые команды:

[ "$Server_Name" = 1 ]

проверяет, $Server_Nameравен ли строка 1.

[ "$Server_Name" -eq 1 ]

Параметр проверок $Server_Nameравен числу 1 , т. е. он выполняет числовое сравнение вместо сравнения строк.

Возвращаемое значение двух команд будет отличаться, например, если вы определите Server_Name=01. Первый вернет false, второй вернет true.

Обратите внимание, что если существует вероятность того, что переменная $Server_Nameне определена, она должна быть заключена в кавычки, иначе при вызове test выдаст ошибку.


1

Пытаться,

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

вывод:

 #./scriptname.sh
 Server Name is below 50

0

Простой ответ Ваш код правильный - почти. единственное, что вам не хватает, это пробелы ... (и, может быть, лишние "=")

if [ $Server_Name=1 ]; then

не будет правильно вычислять.

if [ $Server_Name == 1 ]; then  

это то, что вы ищете.

А теперь утверждение о строках против чисел. Всякий раз, когда вы ищете для сравнения, как есть / нет, то == всегда будет хорошо.

И я предполагаю, что у вас всегда есть имя сервера в виде строки, а не числа - верно? ;-)

Удачи с вашим надежным учеником кодирования.

Чао


Удивительно, что здесь так много ответов ..
Тобибоби
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.