Как использовать операторы сравнения в bash? [дубликат]

Я предлагаю для этого использовать команду gunzip

gunzip /path/to/file/filename.z

, это также будет выводить без вывода сообщений

1
20.03.2017, 17:37
2 ответа

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

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

А также с let . Следующее эквивалентно описанному выше:

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

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

3
27.01.2020, 23:13

В bash в частности:

  • ((arg1 >= num1)) (унаследовано от ksh) выполняет арифметическое сравнение. arg1 и num1 здесь относятся к одноименным переменным оболочки. Каждая переменная интерпретируется как арифметическое расширение, и результат подставляется. Здесь, если $arg1 равно 010 и $num1 равно 4+5, результатом будет false ( команда ((...)) вернется с ненулевым статусом выхода), потому что 010 является восьмеричным для 8, а 4+5 равно 9 ,
  • (($arg1 >= $num1)): то же, что и выше, за исключением того, что $arg1 и $num1 расширяются перед вычислением всего арифметического выражения. Если бы $arg1 было (2 и $num1 было 2), предыдущая команда завершилась бы ошибкой, потому что (2 и 2) не являются допустимыми выражениями сами по себе. Но здесь это удалось бы, потому что (2 >= 2) будет вычисляемым арифметическим выражением. Как правило, в арифметических выражениях лучше не использовать $. Сравните, например, a=2+2; echo "$((3 * $a))" с a=2+2; echo "$((3 * a))".
  • пусть "..." (тоже от кш). То же, что и ((...)), за исключением того, что она анализируется как обычная команда, менее разборчива, так же мало переносима, и вам нужно уделять больше внимания цитированию.
  • ["$arg1" -ge "$num1"]. Это стандартно и портативно. Поддерживаются только десятичные константы. [010 -ge 9 ] совпадает с [10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Тоже от кш, но с большими отличиями. На этот раз $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().
4
27.01.2020, 23:13

Теги

Похожие вопросы