Быстрое обходное решение могло быть к hostname ourwebsiteLIVE
И редактирование /etc/hosts
не перезагружая ошибку должен исчезнуть.
Несогласованность во многом объясняется историческими причинами.
Использование квадратных скобок в качестве условной команды произошло после использования скобок в шаблонах подстановочных знаков. Итак, в то время, когда [-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
интерпретируется как шаблон подстановки. Опять же, вместо того, чтобы запоминать детали, вы можете все время использовать двойные кавычки.
на самом деле символ [
- это встроенная команда оболочки, которая оценивает аргумент до аргумента ]
bash используйте аргумент, разделенный пробелом, поэтому, если вы хотите вызвать [
, вам нужно поставить пробел, иначе он попытается выполнить команду [- n
, который не является функцией или двоичным кодом bash (по крайней мере, пока вы не создадите его самостоятельно).
Когда вы пишете [- n $ 1]
, это означает
[- n
с аргументами $ 1
и ]
, которые не имеют смысла
, и если вы поместите [-n $ 1]
, это означает
[
с аргументом -n
и $ 1]
, но отсутствует аргумент ]
вашей функции [
, поэтому он не может оценить ваше выражение