Когда квадратные скобки требуются в инструкции 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
.