Назначение переменных с пробелом после знака (=)?

В Bash присваивание значений переменным выполняется с помощью T=content, без пробелов до или после знака равенства.

Несмотря на это, я видел следующее в сценарии оболочки PWD= /bin/pwd с пробелом справа от знака равенства.

Какова цель этого пространства?

4 ответа

Решение

В примере PWD= /bin/pwdпеременная PWD устанавливается на пустую строку перед выполнением команды /bin/pwd, Изменение вступает в силу только для этой строки.

Это может быть полезно для временного изменения переменной для выполнения команды, не затрагивая исходное значение. Другой пример этого будет при использовании read, чтобы установить другой IFS:

IFS=, read a b c <<<"comma,separated,list"

Это устанавливает разделитель поля на запятую так, чтобы a, b а также c читаются правильно. После этой строки IFS возвращается к значению по умолчанию, поэтому остальная часть сценария не изменяется.

Возможно, на некоторых системах вывод команды pwd зависит от значения переменной PWDТаким образом, это предотвращает проблемы, вызванные PWD переписывается в другом месте.

PWD= pwd

Этот синтаксис назначает пустое значение переменной PWD на время pwd команда.

PWD=ick
echo "$PWD"

Это назначает PWD для оставшейся части сценария.

PWD=ick pwd
echo "$PWD"

Это назначает PWD только на время pwd команда; echo будет отображать значение, которое было в силе до и после pwd призывание.

PWD=

Это просто присваивает пустое значение PWD,

Мы не говорим здесь о двух разных вещах.

Если бы мы имели

PWD=/bin/pwd

мы бы назначить /bin/pwd в PWD,

Но

PWD= /bin/pwd

означает, что мы называем /bin/pwd с PWD установить пустую строку. Это назначение влияет только на подпроцесс, а не на текущий.

Когда bash или большинство других оболочек видят следующую строку:

      PWD= /bin/pwd

оболочка анализирует командную строку слева направо. Командная строка разбивается на два поля: и поскольку они разделены пробелом без кавычек. Когда он возвращается к синтаксическому анализу первого поля PWD=, он находит не заключенный в кавычки =, и поэтому оболочка рассматривает его как присвоение / инициализацию переменной. Он воспринимается как имя переменной и любая строка, следующая сразу за знаком =, до пробела в качестве значения переменной. В этом случае это будет пустая строка, поскольку после знака = стоит только пробел, а пробел без кавычек является разделителем аргументов в оболочке. Итак, значение будет '' (пустая строка), и, кстати, это влияет только на непосредственную команду / bin / pwd, как упоминали другие.

Если бы перед = тоже был пробел, то оболочка увидела бы всего 3 поля

PWD = /bin/pwd

Shell обработает первое месторождение как псевдоним, функцию или команду, выполняя поиск в местоположениях PATH. Он обработал бы два других поля а также в качестве аргументов первой команды или функции

Другие вопросы по тегам