Почему должно быть место после '[' и до ']' в Bash?

Я пытался написать Bash script, который использует оператор if.

if  [$CHOICE -eq 1];

script давал мне ошибки, пока я не дал пробел после [ и до ], как показано ниже:

if  [ $CHOICE -eq 1 ];

Мой вопрос: почему пространство вокруг квадратных скобок так важно в Bash?

Ответ 1

Как только вы поймете, что [ - команда , становится понятнее!

[ - это еще один способ записать "test".

help [

Однако, пока они делают то же самое, test оказывается более подробной справочной страницей. Проверьте

help test

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


Кроме того, обратите внимание, что я использую, по желанию, help test, а не man test. Это потому, что test и [ теперь являются командами оболочки. Их набор функций может отличаться от /bin/test и /bin/[ от coreutils, которые являются командами, описанными на страницах man.

Ответ 2

Из другого вопроса:

Немного истории: это потому, что '[' был исторически не встроенным в оболочку, а отдельным исполняемым файлом, который получил выражение в качестве аргументов и возвратил результат. Если вы не окружаете "[" пробелом, оболочка будет искать $PATH для другого имени файла (и не найдет его). - Эндрю Медико

Ответ 3

[ - это команда, а $CHOICE должен быть аргументом, но, выполняя [$CHOICE (без пробела между [ и $CHOICE), вы пытаетесь запустить команду с именем [$CHOICE. Синтаксис команды:

command arguments separated with space

Ответ 4

[ - это команда test. Поэтому для этого требуется пространство.