8

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

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

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 ]; часть.

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

5 ответов5

15

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

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

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

Заметки:

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

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

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

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


Дополнительная информация:

3

Попробуй это:

if [ $Server_Name -eq 1 ];then
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
1
[ $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 отобразит ошибку.

0

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

if [ $Server_Name=1 ]; then

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

if [ $Server_Name == 1 ]; then  

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

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

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

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

Чао

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .