Когда квадратные скобки требуются в инструкции Bash if?

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

[ на самом деле является командой, эквивалентной (почти, см. ниже) команде 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 для получения дополнительной информации.

FOOTNOTE: команда [ почти эквивалентна команде test. Разница в том, что [ требует ] в качестве последнего аргумента, а test не делает - и на самом деле не позволяет этого. (Это не должно было быть реализовано таким образом, но [ без соответствия ] заставил бы очень много людей очень нервничать.)

Ответ 3

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

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

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

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

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