Вопрос Арифметические двоичные операторы -gt, -lt дают ошибку, но работают в сценарии оболочки


Я написал этот простой скрипт, он тоже работает, но показывает ошибку

clear
echo Enter 1st number
read n1
echo Enter 2nd number
read n2
echo MUlti is `expr $n1 \* $n2`;
if [$n1 -lt $n2]
then
 echo $n1 'is bigger than' $n2
else
 echo $n2 'is bigger than' $n1
fi

вывод

Enter 1st number
5
Enter 2nd number
10
MUlti is 50
./script.sh: line 7: [5: command not found
10 is bigger than 5

2
2017-08-18 02:58


происхождения




ответы:


[ это встроенная команда, также известная как test, и поскольку для всех команд требуется, по крайней мере, пространство, чтобы отделить его от других слов в команде. [ также доступна как регулярная команда в /usr/bin/[ или /usr/bin/test,

Наличие окончательного ] вместо этого является требованием команды при вызове как [, и пространства вокруг него требуются как для каждого параметра команды.

Тем не менее, в bash вы должны использовать команду [[, что имеет некоторые преимущества перед [, например, поддерживая && а также || для логических операций, кроме -a а также -o,

Более того, для выполнения целочисленных арифметических операций и сравнения целых чисел лучше использовать арифметические разложения $((math operations)), и соответствующая команда ((math ops)),

С этими наблюдениями ваш скрипт может быть:

#!/bin/bash

clear
echo "Enter 1st number"
read n1
echo "Enter 2nd number"
read n2
echo "Multi is $((n1 * n2))"
if ((n1 > n2)); then
  echo "$n1 is bigger than $n2"
else
  echo "$n2 is bigger than $n1"
fi

Не забудьте сделать его исполняемым (chmod +x my-script), затем выполните его с помощью ./my-script,


9
2017-08-18 06:56



Любопытно, есть ли необходимость, кроме удобства, сделать скрипт исполняемым, а не звонить bash script.sh? Насколько я понимаю, они оба переводят на те же действия со стороны оболочки, но я могу ошибаться. - Kris Harper
@ root45: нет никакой разницы, о которой я знаю. Кроме того, последний работает также, если script.sh не помечен как исполняемый файл. Но пользователь не должен знать, как разработчик пишет приложение, он должен просто назвать его по имени. В /usr/bin существуют бинарные файлы ELF, perl, python, sh, bash, а также другие типы приложений. - enzotib


Для операторов bash conditional if вы должны иметь пробелы прямо перед и после вашего состояния. Ваш должен выглядеть так:

if [ $n1 -lt $n2 ]

вместо

if [$n1 -lt $n2]

Гуфи, но это оболочка bash.


5
2017-08-18 03:16