Я испытываю затруднения при выяснении некоторых нюансы между одинарными и двойными кавычками в переменном контексте
Я определяю:
foo=pwd
затем выполнение они:
echo $'$foo'
Какой echos $foo
(значение первого $
в моем эхе команда отбрасывается),
echo $"$foo"
Этот echos pwd
(что означает, что удар расширяется $foo
, моя переменная, к ее значению)
echo $`$foo`
Наконец этот echos $~/scripts
(Я ожидал, что это распечатает ~/scripts
и нет $~/scripts
)
кто-то может помочь мне выяснить эти различия?
echo $'$foo'
: $'[...]'
маркер вокруг $foo
интерпретирует $foo
буквально (как $foo
) и попытки развернуть ANSI подобные C escape-последовательности в нем, которые не присутствуют, таким образом, echo
урожаи $foo
;echo $"$foo"
: $"[...]"
маркер вокруг $foo
расширяется $foo
к его значению (pwd
) и попытки перевести его, если текущей локалью не является POSIX / C; этого не происходит, потому что или текущей локалью является POSIX / C или перевод для pwd
не доступно, таким образом, echo
урожаи pwd
;echo $`$foo`
: `[...]`
маркер вокруг $foo
позволяет расширение $foo
, так $foo
расширен до его значения (pwd
); расширенное значение выполняется в подоболочке, чья производил (~/scripts
) заменяет целое `[...]`
маркер, таким образом, echo
урожаи $
маркер, сопровождаемый ~/scripts
маркер ($~/scripts
).В конечном счете, последняя печать $~/scripts
потому что $`foo`
комбинация литерала $
сопровождаемый заменой команды; так продвижение $
интерпретируется как литерал $
и запаздывание `$foo`
как замена команды.
Первый случай:
echo $'$foo'
Какой echos
$foo
(значение первого$
в моем эхе команда отбрасывается),
Первое $
выполняется как команда. Эхо не требует пробелов между аргументами, оно просто берет их.
Так эхо $'$foo'
расширяется для выполнения команды $
(который не является командой, таким образом, она игнорирует его), и затем отзовитесь эхом '$foo'
. Что-либо в ''
взят по номиналу - это не разворачивает его или ничто. Можно поместить то, что Вы хотите в, '' и ничего не происходит.
Если Вы заменяете $
с $$
это echos идентификатор процесса.
Во-вторых:
echo $"$foo"
Этот echos
pwd
(что означает, что удар расширяется$foo
, моя переменная, к ее значению)
Поэтому ""
не предотвращает его расширение. ""
обычно используется, чтобы гарантировать, что существует значение для сравнения с.
Если у Вас есть переменная, которая могла бы быть пустой (например, это от a grep
результат) затем Вы хотите выдержать сравнение с другим значением / переменная, необходимо вставить первую переменную ""
. Это гарантирует, что всегда существует сравнение с проверкой, а не просто пустой раздел кода (как удар видит), который дает ошибку.
Наконец, номер 3. Это интересно.
echo $`$foo`
Этот echos
$~/scripts
(Я ожидал, что это распечатает~/scripts
и нет$~/scripts
)
Поэтому (в этом случае) эхо печатает $
символ сначала. Помещение чего-то в обратных галочках заставляет значение переменной быть выполненным как команда (лучший способ сделать, это в более поздних версиях удара $(command)
)
Таким образом, сначала это echos $
затем это расширяется `$foo`
кому: `pwd`
который выполняется и возвращается ~/Scripts
. Но мы имели $
печать ранее - так целый вывод $~/Scripts
.