Почему тесты удара так требовательны в отношении пробела?

Быстрое обходное решение могло быть к hostname ourwebsiteLIVE И редактирование /etc/hosts не перезагружая ошибку должен исчезнуть.

7
03.06.2015, 00:40
2 ответа

Несогласованность во многом объясняется историческими причинами.

Использование квадратных скобок в качестве условной команды произошло после использования скобок в шаблонах подстановочных знаков. Итак, в то время, когда [-n foo] появился на сцене, [foo] уже означало «файл с именем f или o ». Хотя небольшое использование оператора скобок на практике противоречило бы реалистичному использованию скобок в подстановочных знаках, авторы предпочли не рисковать нарушением существующих скриптов путем изменения синтаксиса. Этот выбор дизайна также упростил реализацию: изначально [ было реализовано как внешняя команда, чего нельзя было бы сделать, если бы пробел после [ был необязательным. (Современные системы по-прежнему имеют [ в качестве внешней команды, но почти все современные оболочки также имеют встроенную команду.)

По тем же причинам ваш «рабочий» код на самом деле неверен в большинстве случаев. $ 1 не означает «значение параметра 1»: это означает «взять значение параметра 1, разделить его на отдельные слова через пробел (или любое другое значение IFS ] , и интерпретировать каждое слово как узор шара ».Чтобы написать «значение параметра 1», нужны двойные кавычки: «$ 1» . См. Когда необходимо использовать двойные кавычки? для более подробной информации. Вам не нужно этого понимать; все, что вам нужно запомнить: всегда заключайте в двойные кавычки замену переменных «$ foo» и подстановку команд «$ (foo)» . Таким образом:

if [ -n "$1" ]; then …

В bash, ksh и zsh, но не в обычном sh, вы также можете использовать двойные скобки. Одиночные скобки […] анализируются как обычная команда (и действительно [ - обычная команда, хотя обычно встроенная). Двойные скобки - это отдельная синтаксическая конструкция, и в большинстве случаев вы можете опускать двойные кавычки.

if [[ -n $1 ]]; then …

Однако есть исключение: [["$ foo" = "$ bar"]] , чтобы проверить, имеют ли две переменные одинаковое значение, требуются двойные кавычки вокруг $ bar ], иначе $ bar интерпретируется как шаблон подстановки. Опять же, вместо того, чтобы запоминать детали, вы можете все время использовать двойные кавычки.

17
27.01.2020, 20:13

на самом деле символ [ - это встроенная команда оболочки, которая оценивает аргумент до аргумента ]
bash используйте аргумент, разделенный пробелом, поэтому, если вы хотите вызвать [, вам нужно поставить пробел, иначе он попытается выполнить команду [- n , который не является функцией или двоичным кодом bash (по крайней мере, пока вы не создадите его самостоятельно).

Когда вы пишете [- n $ 1] , это означает
[- n с аргументами $ 1 и ] , которые не имеют смысла
, и если вы поместите [-n $ 1] , это означает
[ с аргументом -n и $ 1] , но отсутствует аргумент ] вашей функции [, поэтому он не может оценить ваше выражение

{{ 1}}
11
27.01.2020, 20:13

Теги

Похожие вопросы