Как использовать операторы сравнения в bash?

Как использовать <= , >= , > и < в bash?

Вместо:

 if [[ $arg1 -ge $num1 && $arg2 -le $num2 ]]; then ... fi 

Есть что-то еще:

 if [[ $arg1 >= $num1 && $arg2 <= $num2 ]]; then ... fi 

Эти операторы используются, например, (( ... )) и $(( ... )) ( арифметическая оценка и арифметическое расширение соответственно):

 if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

А также с let . Ниже приведено следующее:

 if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

См. Раздел «АРИФМЕТИЧЕСКАЯ ОЦЕНКА» в руководстве Bash.

В bash конкретно:

  • ((arg1 >= num1)) (унаследованный от ksh ) делает арифметическое сравнение. arg1 и num1 здесь относятся к переменным оболочки с тем же именем. Каждая переменная интерпретируется как арифметическое расширение и результат заменяется. Здесь, если $arg1 равен 010 а $num14+5 , результат будет false (команда ((...)) вернется с ненулевым статусом выхода), потому что 010 является восьмеричным для 8 и 4+5 9.
  • (($arg1 >= $num1)) : то же самое, что и выше, за исключением того, что $arg1 и $num1 расширяются до того, как будет оценено все арифметическое выражение. Если $arg1 был (2 и $num1 2) , предыдущая команда потерпела бы неудачу, потому что (2 и 2) не являются допустимыми выражениями самостоятельно. Но здесь это будет успешным, потому что (2 >= 2) будет оцениваться арифметическим выражением. Как правило, в арифметических выражениях лучше оставить $ out. Сравните, например, a=2+2; echo "$((3 * $a))" a=2+2; echo "$((3 * $a))" с a=2+2; echo "$((3 * a))" a=2+2; echo "$((3 * a))" .
  • let "..." (также из ksh). То же, что и ((...)) за исключением того, что он анализируется как обычная команда, менее разборчив, так же мало переносится, и вам нужно уделять больше внимания цитированию.
  • [ "$arg1" -ge "$num1" ] . Это стандартное и портативное. Поддерживаются только десятичные константы. [ 010 -ge 9 ] совпадает с [ 10 -ge 9 ] .
  • [[ $arg1 -ge $num1 ]] . Также из ksh, но с большими отличиями. На этот раз $arg1 и $num1 рассматриваются как арифметические выражения, а не только десятичные константы. [[ 010 -ge 9 ]] снова возвращает значение false.
  • [[ $arg1 < $num1 ]] . Сравнение строк. Это использует strcoll() для сравнения строк, поэтому используйте алгоритм сортировки в локали. Обратите внимание, что в то время как < и > используют алгоритм сортировки, = / == выполняют сравнение байтов в байтах, поэтому могут быть пары строк, для которых все < , > и = / == возвращают false. <= и >= не поддерживаются.
  • [ "$arg1" "<" "$num1" ] . Нестандартные. То же, что и выше, но с помощью команды [ . < необходимо указывать, чтобы он не принимался за оператора перенаправления.
  • expr " $arg1" "<=" " $num1" > /dev/null (обратите внимание на встроенные пространства, чтобы заставить лексическое сравнение избегать проблем со строками, похожими на операторы expr ) или awk 'BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}' "$arg1" "$num1" являются стандартными командами для сравнения строк с использованием strcoll() .