Bash операторы сравнения и выражения

11

Я новичок в программировании Bash. Я прочитал два хороших, длинных руководства, но они запутались в моей голове об операторах и ключевых словах.

Какие из них более широко и широко используются? Я не знаю, когда использовать, что и почему.

  1. test, [[ ]]Или [ ]даже(( ))
  2. $((exp)) или $[exp]
  3. -gtили >, geили >=т. д.
  4. когда использовать <и >или ( )и когда мы должны избежать его \: \< \(и т. д.
  5. ==или =(сравнение строк)

Я знаю , что основные различия между [и , [[но и другими вопросами являются для меня загадкой.

заранее спасибо

MikeD
источник
2
Очень полезная вики, которая актуальна и упоминает о хорошей практике, - это вики Грега . Руководство Bash и FAQ там особенно полезны.

Ответы:

5
  • testэто встроенная оболочка, которая (очевидно) проверяет некоторые заданные условия. Некоторым более старым снарядам нужна специальная команда. Так что вы также найдете программу на /usr/bin/test.
  • [это также программа для проверки некоторых условий. Это программное обеспечение также нуждается в закрывающей скобке, и вы можете найти его на /usr/bin/[.
  • [[…]]является альтернативой testи [. Он был разработан для оболочки Korn ( ksh). Но вы также можете найти его в версиях Bash больше 2 и в Z Shell. У двойных скобок есть некоторые изящные особенности:
    • Оболочка не разделяет слова и не раскрывает имя файла.
    • Вам не нужно цитировать.
    • Вместо -a(И) или -o(ИЛИ) вы можете использовать &&или ||.
    • =Может сделать намного больше.
  • ((…))эквивалентно let. Так что в основном так ((expression))же, как let "expression". Однако letвы можете использовать более одного выражения, но двойные скобки допускают только одно выражение.
  • $((…))(а также $[…]) делает некоторые вычисления. Ваша оболочка пытается вычислить выражение внутри фигурных скобок и заменяет выражение результатом. Так echo $((1+1))приводит к echo 2. Так что ваши снаряды печатает номер 2.

Каждый раз, когда вы хотите сравнить два числа, вы должны использовать опцию с тире и двумя буквами ( -geи -ltт. Д.). Если вы хотите сравнить строки, вы должны использовать =или !=.

На ваш вопрос о побеге довольно сложно ответить. Потому что это зависит от программного обеспечения, которое вы используете, кроме как из оболочки. То есть grepи grep -Eнужно по-другому сбежать. Это также касается sed, awkи другие. Так что лучший вариант - заглянуть на страницу руководства. Через некоторое время вы привыкаете и знаете, когда использовать побег.

QBi
источник
Спасибо. еще один вопрос - потому что можно проводить сравнение с использованием ((...)) - более распространено использование этой версии: if ((2> 1)) ИЛИ это: if [[2 -gt 1]]
MikeD
Я бы предположил, что if [ 2 -gt 1 ]; …это более распространено, потому что я вижу это чаще в сценариях оболочки и насколько я знаю, что это POSIX-совместимый.
Qbi
Следует также помнить, что [выражение] имеет значение «истина», если выражение имеет значение / возвращает ноль, но ((выражение)) имеет значение «истина», если выражение имеет значение / возвращает ненулевое значение.
Джо