Разница между $ '$ foo' и $ “$ foo”

9

У меня возникают трудности с выяснением некоторых нюансов между одинарными и двойными кавычками в контексте переменной

Я определяю:

foo=pwd

затем запустите эти:

echo $'$foo'

Какое эхо $foo(имеется в виду, что первая $в моей команде эха отброшена)

echo $"$foo"

Это эхо pwd(что означает, что bash расширяет $fooсвою переменную до значения)

echo $`$foo`

Наконец-то этот отголосок $~/scripts(я ожидал, что это будет печатать, ~/scriptsа не $~/scripts)

Может ли кто-нибудь помочь мне разобраться в этих различиях?

Илан
источник

Ответы:

11

В конечном счете, последний печатает, $~/scriptsпотому что $`foo`это комбинация литерала с $последующей подстановкой команд; таким образом, ведущий $интерпретируется как литерал, $а завершающий - `$foo`как замена команды.

кос
источник
Я удалил теги кода и заменил их просто символами `` `` `` `` и т. Д. Не стесняйтесь откатываться, если вы предпочитаете теги кода
Тим
@Tim Спасибо, не уверен, что именно я сделал, но по какой-то причине после того, как вы отредактировали, пост оказался таким же разрушенным, как и в моей первой ревизии, поэтому я откатил его назад ... И теперь я вижу, что в ревизии все выглядит нормально. Не уверен, что случилось, собираюсь проверить это в песочнице форматирования, прежде чем вернуться к вашей версии, так как боюсь, что могу снова нарушить пост. Независимо, спасибо за усилия.
Кос
конечно, никаких проблем Мой использует пробелы нулевой ширины, поэтому будьте осторожны при редактировании.
Тим
2

Первый случай:

echo $'$foo'

Какое эхо $foo(имеется в виду, что первая $в моей команде эха отброшена)

Первый $запускается как команда. Эхо не требует пробелов между аргументами, оно просто принимает их.

Таким образом, эхо $'$foo'расширяется для запуска команды $(которая не является командой, поэтому игнорирует ее), а затем эхо '$foo'. Все, что ''входит в это, принимается за чистую монету - оно не расширяет его или что-либо еще Вы можете положить то, что вы хотите в '', и ничего не происходит.

Если заменить $с $$ним вторит идентификатор процесса.


Во-вторых:

echo $"$foo"

Это эхо pwd(что означает, что bash расширяет $fooсвою переменную до значения)

Это потому ""что не мешает расширению. ""обычно используется, чтобы убедиться, что есть значение для сравнения.

Если у вас есть переменная, которая может быть пустой (например, из grepрезультата), то вы хотите сравнить с другим значением / переменной, вы должны поместить первую переменную в "". Это гарантирует, что всегда есть сравнение для проверки, а не просто пустой фрагмент кода (как видит bash), который выдает ошибку.


Наконец, номер 3. Это интересно.

echo $`$foo`

Это эхо $~/scripts(я ожидал, что это будет печатать, ~/scriptsа не $~/scripts)

Это потому, что (в этом случае) echo $сначала печатает символ. Помещение чего-либо в backticks приводит к тому, что значение переменной запускается как команда (лучший способ сделать это в более поздних версиях bash - это $(command))

Итак, сначала это эхо, $затем оно расширяется ​`$foo`​до того, ​`pwd`​что запускается и возвращается ~/Scripts. Но у нас был $отпечаток ранее - так что весь вывод есть $~/Scripts.

Тим
источник
Хорошая работа по очень сложному форматированию!
Arronical
1
@ Arronical Спасибо :) Вы не можете видеть это, но есть несколько пробелов нулевой ширины там для последнего предложения. То, что я делаю для мнимых интернет-точек ...!
Тим
1
+1 Хороший ответ. Я бы просто добавил, что переменные в кавычках должны использоваться по умолчанию, если только у вас нет особой причины - не просто обрабатывать возможные нулевые значения. См unix.stackexchange.com/questions/171346/... больше , чем вы когда - либо хотели знать об этом. ;)
Джо