Я начинаю изучать написание сценариев для терминала bash, но не могу понять, как заставить сравнения работать должным образом. Сценарий, который я использую:
echo "enter two numbers";
read a b;
echo "a=$a";
echo "b=$b";
if [ $a \> $b ];
then
echo "a is greater than b";
else
echo "b is greater than a";
fi;
Проблема в том, что он сравнивает число с первой цифры, т.е. 9 больше 10, а 1 больше 09.
Как я могу преобразовать числа в тип, чтобы сделать истинное сравнение?
;
конец строки излишен. Не причиняя никакого вреда, просто трата нажатий клавиш (если вы не любите вводить точки с запятой).10#$number
такnumber=09; echo "$((10#$number))"
будет выводить в9
то время какecho $((number))
будет производить «значение слишком велико для базы» ошибки.>
оператор делает в[
команде сравнение порядка, в котором должны сортироваться две строки, а не порядка, в котором они сортируются как числа. Вы можете найти больше информации вman test
.Ответы:
В bash вы должны выполнить проверку в арифметическом контексте :
Для оболочек POSIX, которые не поддерживают
(())
, вы можете использовать-lt
и-gt
.Вы можете получить полный список операторов сравнения с помощью
help test
илиman test
.источник
"$a" -gt "$b"
это правильный ответ. Вот хороший список тестовых операторов: Test Constructs .test
это программа как есть[
. Так чтоhelp test
дает информацию об этом. Чтобы узнать, какие встроенные модули ([[
и((
) вы должны использовать,help bash
и перейдите к этой части.Легко и просто
Вы можете проверить эту таблицу, если хотите больше сравнения чисел в удивительном мире Bash Scripting.
Вкратце, целые числа можно сравнить только с:
источник
"$a"
и"$b"
не являются строго необходимыми, но это хорошая практика. Фигурные скобки здесь не помогают."
обязательны ли кавычки или[ $a -eq $b ]
тоже хорошо?if [[ $a -eq $b ]];then
Есть еще одна приятная вещь, о которой некоторые люди могут не знать:
Этот код напечатает наименьшее число из
a
иb
источник
b
бы, еслиa == b
.echo "The smaller number is $(( a < b ? a : b ))."
a < b
это все еще верно, еслиa == b
. Я не знаю всех капризов условностей Баша, но есть почти наверняка ситуации, когда это будет иметь значение.a == b
, тогдаa < b
оценивается как ложное, поэтому оно будет напечатаноb
.В Bash я предпочитаю делать это, так как он больше относится к условной операции, чем к использованию,
(( ))
которая скорее арифметическая.Если я не делаю сложные вещи, такие как
Но у каждого просто есть свои предпочтения. Печально то, что некоторые люди навязывают свои неофициальные стандарты.
Обновить:
Вы также можете сделать это:
Который позволяет вам добавить что-то еще, что вы могли бы сделать,
[[ ]]
кроме арифметических вещей.источник
[[ ]]
это вызывает арифметический контекст, например(( ))
, гдеN
рассматривается, как если бы это было$N
, но я не думаю, что это правильно. Или, если это не было намерением, использованиеN
иM
сбивает с толку.[[
командой,Arg1
иArg2
оцениваются как арифметические выражения [...]».NUMBER=0.0; while [[ "$NUMBER" -lt "1.0" ]]; do
и это говоритbash: [[: 0.0: syntax error: invalid arithmetic operator (error token is ".0")
Этот код также может сравнивать числа с плавающей точкой. Он использует awk (это не чистый bash), однако это не должно быть проблемой, так как awk - это стандартная команда POSIX, которая, скорее всего, поставляется по умолчанию с вашей операционной системой.
Чтобы сделать его короче, используйте эту функцию:
источник
bash
не могу их правильно сравнить (попробуйтеif (( 18446744073692774399 < 8589934592 )); then echo 'integer overflow'; fi
).awk
работает как шарм (if awk "BEGIN {return_code=(18446744073692774399 > 8589934592) ? 0 : 1; exit} END {exit return_code}"; then echo 'no integer overflow'; fi
).Если у вас есть плавающие числа, вы можете написать функцию, а затем использовать ее, например:
источник
В скобках (например,
[[ $a -gt $b ]]
или(( $a > $b ))
) недостаточно, если вы хотите использовать и числа с плавающей точкой; это сообщит об синтаксической ошибке. Если вы хотите сравнить числа с плавающей точкой или число с плавающей точкой с целым числом, вы можете использовать(( $(bc <<< "...") ))
.Например,
Вы можете включить более одного сравнения в оператор if. Например,
Это полезно, если вы хотите проверить, находится ли числовая переменная (целочисленная или нет) в числовом диапазоне.
источник
if [ "$(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b; fi
if [ $(bc <<<"$a > $b") == "1" ]; then echo "a is greater than b"; fi
? (Я думаю, что ваша команда была написана неправильно.) Если так, это тоже работает. Команда Bash Calculator (bc) является базовой командой калькулятора. Еще несколько примеров использования можно найти здесь и здесь . Я не знаю, почему моя команда примера не сработала для вас.Я решил это, используя небольшую функцию для преобразования строк версии в простые целочисленные значения, которые можно сравнить:
Это делает два важных предположения:
Например
Пример проверки соответствия
npm
команды минимальным требованиям ...источник