Расширение переменных в Bash

Расширение переменных в Bash

Я попробовал следующие команды

variable='one|name'
echo $variable

Выходной сигнал:

one|name

тогда как echo one|nameвыдает ошибку No command 'name' found. Это разумно, поскольку bash обрабатывает |как канал и пытается выполнить команду nameс oneвходными данными.

Но почему echo $variableprint one|name? После раскрытия параметров и переменных не должно ли это быть эквивалентно echo one|name?

Версия:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)

решение1

Нет, не должно, из-за способаbash выполнить команду.

При вводе команды выполняется ее echo one|nameсинтаксический bashанализ, обрабатывается |как токен конвейера, поэтому |выполняется конвейер.

Когда вы вводите echo $variable, поскольку разбор токена происходит до расширения переменной, bashкоманда разделяется на две части, echoи $variable. После этого выполняется расширение переменной, расширение $variableдо one|name. В этом случае one|name— это строка, |является частью строки и не может рассматриваться как токен конвейера (конечно,фраза распознавания токенабыло сделано). Единственное, что может быть особенным, если IFSпеременная содержит |, bashбудет использоваться |в качестве разделителя для выполнения разделения полей:

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name

решение2

Причина в способе Bashрасширения переменной.

Вместо того, чтобы расширять переменную до , one|nameон расширяет переменную до "one|name". Так что здесь, поскольку значение заключено в кавычки, оно рассматривается как строка, а не как команда.

Ниже приведен straceвывод команды, показывающий, как она расширяется.

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000

решение3

Кавычки являются частью созданной вами строки.

Если бы ты это сделал

variable=one|name
echo $variable

результат будет таким, как и ожидалось. Но это можно сделать только в скрипте (спасибо за полезный комментарий).

Связанный контент