2
#!/bin/bash
echo "Int. a number"
read num1
echo "Int. another numer"
read num2
if ["$num1"="$num2"]; then
echo "Equals"
else
echo "Dif"
fi
if["$num1"<0]; then
echo "The number $num1 is negative"
else if ["$num2"<0]; then
echo "The number $num2 is negative"
fi
#

этот код не работает, я что-то не так, когда я вижу, если число <0.

Спасибо

3 ответа3

5

Неверный синтаксис. Пожалуйста, прочитайте документацию о команде [ (help [ / help test)

Каждый аргумент должен быть собственным аргументом, т.е. вы должны использовать пробелы между ними: [ "$num1" == "$num2" ] . Причина, по которой вы не видите ошибку при первой проверке, состоит в том, что она пытается найти команду с именем (с num1 = 3 и num2 = 4) [3==4] , которая не существует, поэтому выражение оценивается как ложный. При первой проверке вы написали < , который является оператором оболочки для перенаправления ввода . Он пытается открыть файл 4] , которого в большинстве случаев не существует.

Однако при сравнении чисел следует использовать -eq и аналогичные, == для сравнения строк: [ 3 == 3.0 ] - false, [ 3 -eq 3.0 ] - true.

3

В Bash вы можете выполнять числовые сравнения со знакомыми операторами, если используете арифметическую оценку:

if ((num1 ==num2 ))

if ((num1<0))    # in this context, < is not evaluated as a redirection operator

else if (( $num2 < 0 ))

Как вы можете видеть, я довольно свободно использовал пробелы и могу опустить знак доллара, если захочу. Вы должны знать об этом, однако:

a=    # set to nothing, thus null
if (( a == 0 )); then echo "ok"; fi    # echoes "ok" since a evaluates to 0
if (( $a == 0 )); then echo "ok"; fi    # produces an error even if $a is quoted

Сравнение строк можно выполнить с помощью «<» и «>» вместо «-lt» и «-gt», если вы используете двойные квадратные скобки. Требования к пробелам такие же, как и для одинарных квадратных скобок.

s="b"
if [[ "$s" > "a" ]]
t=    # null
if [[ $t < "a" ]]    # evaluates to true

Как вы можете видеть в последнем примере, при использовании двойных квадратных скобок нет необходимости заключать в кавычки переменные для защиты от возможности того, что они будут нулевыми или неустановленными, в отличие от использования одинарных квадратных скобок.

2

Операторы, которые вы используете, выполняют сравнение строк. Вы должны использовать -eq для целочисленного равенства, -lt для меньше чем, и т.д. (Они также должны быть окружены пробелами).

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