Когда в выражении Bash if требуются квадратные скобки? - PullRequest
58 голосов
/ 20 января 2012

Обычно я использую квадратные скобки в операторе if:

if [ "$name" = 'Bob' ]; then ...

Но когда я проверяю, удалось ли grep, я не использую квадратные скобки:

if grep -q "$text" $file ; then ...

Когда квадратные скобки необходимы в операторе if?

Ответы [ 3 ]

104 голосов
/ 20 января 2012

Квадратные скобки являются синонимом команды test. Оператор if проверяет состояние выхода команды, чтобы решить, какую ветвь выбрать. grep -q "$text" - это команда, а "$name" = 'Bob' - нет, это просто выражение. test - это команда, которая берет выражение и оценивает его:

if test "$name" = 'Bob'; then ...

Поскольку квадратные скобки являются синонимом команды test, вы можете переписать ее как исходное утверждение:

if [ "$name" = 'Bob' ]; then ...
27 голосов
/ 20 января 2012

[ фактически является командой, эквивалентной (почти, см. Ниже) команде test.Это не часть синтаксиса оболочки.(И [, и test, в зависимости от оболочки, также часто являются встроенными командами, но это не влияет на их поведение, за исключением, возможно, производительности.)

Оператор ifвыполняет команду и выполняет часть then, если команда выполняется успешно, или часть else (если есть), если она не выполняется.(Команда завершается успешно, если она завершается с состоянием ($?), равным 0, не выполняется, если она завершается с ненулевым состоянием.)

В

if [ "$name" = 'Bob' ]; then ...

команда имеет вид

[ "$name" = 'Bob' ]

(Вы можете выполнить эту же команду напрямую, без if.)

В

if grep -q "$text" $file ; then ...

команда

grep -q "$text" $file

man [ или man test для получения дополнительной информации.

ПРИМЕЧАНИЕ: Ну, команда [ почти эквивалентна команде test.Разница в том, что [ требует ] в качестве последнего аргумента, а test - и фактически не позволяет этого.(У него не было , который должен быть реализован таким образом, но [ без соответствующего ] заставило бы многих людей очень сильно нервничать.)

9 голосов
/ 20 января 2012

Лучший способ думать о синтаксисе [ ... ] - это считать [ программой, которая есть!

Проверьте это:

~ $ ls /usr/bin/\[ 
/usr/bin/[

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

В любом случае, чтобы ответить на ваш вопрос: if выполняет команду, которую вы ей даете, и видите, что возвращаемое значение равно 0 или нет. Вы используете [ для других, более интересных сравнений, таких как сравнение строк. См man [ и man bash.

...