Як перевірити, чи змінна дорівнює числу в оболонці


13

У мене є такий скрипт оболонки, який не працює.

Вхід:

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 ...
mikebabcock

Відповіді:


22

Ваш сценарій вказує, що ви використовуєте порівняння рядків.

Припустимо, ім'я сервера може бути рядком, а не лише числом.

Для порівняння рядків :
if [[ "$Server_Name" == 1 ]]; then

Примітки:

  • Розміщення навколо == обов’язково
  • Розміщення навколо = є обов'язковим
    if [ $Server_Name=1 ]; then WRONG

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

  • Віддайте перевагу цитуючи рядки, що є "словами"

Для порівняння Integer :
if [[ "$Server_Name" -eq 1 ]]; then


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


2
[[синтаксис bash, і ОП запитували про оболонку, де це не працюватиме
gilad mayani


2
[ $Server_Name=1 ]

не працює за призначенням, оскільки синтаксис в окремих дужках не є особливим для Bash. Як завжди, змінна $Server_Nameстає заміщеною на 1, тому вся команда test ( [) бачить один аргумент: рядок 1=1. Оскільки ця жала має ненульову довжину, тест повертає істину .

Для сумісних з POSIX оболонок можна використовувати наступні тестові команди:

[ "$Server_Name" = 1 ]

check - $Server_Nameце дорівнює рядку 1.

[ "$Server_Name" -eq 1 ]

check - $Server_Nameце дорівнює кількості 1 , тобто він робить числове порівняння замість порівняння рядків.

Повернене значення двох команд буде відрізнятися, наприклад, якщо ви визначаєте Server_Name=01. Перший поверне помилковий, другий поверне істинним.

Зауважте, що якщо існує можливість того, що змінна $Server_Nameне визначена, вона повинна бути котирована або тест покаже помилку при виклику.


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.