Как я могу повторить знаки доллара?

67

Например, $PATHи$HOME

Когда я набираю, echo $PATHон возвращает мое $PATH, но я хочу повторить слово, $PATHа не то, что означает реальная переменная, echo "$PATH"тоже не работает.

Отображаемое имя
источник
да использовать одиночные кавычки , как: echo '$PATH'. для получения дополнительной информации о цитировании, посетите это и это
Pandya
@don видел только обман на сервере. Виноват.
geedoubleya
Возможный дубликат Как использовать специальный символ как нормальный?
Стефан Шазелас
@ StéphaneChazelas Этот вопрос почти на два года новее, чем этот.
DisplayName
@DisplayName, да, но задумано как «канонический» вопрос, чтобы охватить все те «как мне отобразить специальный символ X». (Я не уверен, что мне нравится идея, что эти «канонические» ответы на все вопросы используются для закрытия конкретных вопросов, поэтому я просто добавил его в качестве комментария вместо закрытого голосования).
Стефан Шазелас

Ответы:

77

Вам просто нужно сбежать от доллара $.

echo \$PATH
$PATH

Или заключите его в одинарные кавычки:

echo '$PATH'
$PATH

Это гарантирует, что слово не интерпретируется оболочкой.

geedoubleya
источник
1
Спасибо, echo -eна странице руководства ничего не сказано .
DisplayName
-eФлаг используется для расширения, например, \tв буквальном табуляции. Это не связано с выходом из знака доллара для предотвращения расширения параметров.
chepner
2
Это не работает при обращении к файлу. echo '\$PATH' >> output.txtв результате в файл записывается "/ usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games: / opt / vc / bin" , а не "$ PATH".
Cerin
2
Очень интересно, если вы используете одинарные кавычки и экранированный символ, то это должно просто повторить \ $ PATH. Из какой ОС / пакета получена ваша эхо-команда?
geedoubleya
@Cerin для вас @ Stéphane ответ работал echo '\044*' > first.txtон будет выводить $ * в first.txt
Maq
20

$в синтаксисе большинства оболочек это очень специальный символ. Если мы только посмотрим на борновоподобные снаряды, то используем:

  1. параметр разложения , как и в $#, $var,${foo:-bar}
  2. подстановка команд как в $(logname)(также ${ logname;}в некоторых оболочках, чтобы избежать подоболочки)
  3. арифметическое расширение как в $((1+1))(также $[1+1]в некоторых оболочках).
  4. другие формы цитирования в некоторых оболочках, такие как $'\n'или $"localized string".

За исключением последнего случая, эти расширения / замены все еще происходят в двойных кавычках (и внутри $"..."в bashили ksh93)

Чтобы это $не обрабатывалось особым образом, вы должны указать это:

  • одинарные кавычки: echo '$PATH'или echo '$'PATH. Тот, который вы обычно хотели бы использовать, поскольку он экранирует все символы (кроме себя) в большинстве оболочек.
  • blackslash: echo \$PATH. Также внутри двойных кавычек:echo "\$PATH"
  • в некоторых оболочках, другой со ссылкой на оператора: echo $'$PATH', echo $'\44PATH'(при условии , совместимый набор символов ASCII),echo $'\u0024'

Или убедитесь, что это не является частью действительной формы расширения, как указано выше:

  • echo "$"PATH
  • echo $""PATH,echo $"PATH" . Этого следует избегать, потому что некоторые оболочки любят ksh93и bashподдерживают $"..."форму цитат.
  • echo $``PATH, Нет причин, почему вы хотели бы использовать это, кроме как показать, что это возможно
  • echo "${$+$}PATH" и другие запутанные ...

Или вы можете вывести это $другим способом:

  • с Unix-совместимым echo: echo '\044PATH'(некоторые другие echoпотребности echo -e '\044PATH')
  • printf '\44PATH\n'
  • кот << \ EOF
    $ PATH
    EOF

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

Надеюсь, к настоящему времени уже ясно, что хотя есть много способов сделать это, нет веской причины, по которой вы захотите использовать что-то еще, кроме как echo '$PATH'здесь.

Стефан Шазелас
источник
1

Обратите внимание, что литерал $ внутри двойных кавычек может быть проблемой. Это можно сделать, создав $ вне двойных кавычек, например:

echo "My terminal is $term, first file found in /dev is </dev/`ls /dev | head -n 1`>, the
dollar symbol is '"`echo '$'`"', and a newspaper costs "`echo '$'`"2.50."

or like this:

echo "$term is the value of "'$term'

ВЫХОД:

My terminal is xterm, first file found in /dev is </dev/acpi>, the dollar symbol
is '$', and a newspaper costs $2.50.

xterm is the value of $term
Stilez
источник
Или, echo "$term is the value of \$term"как уже объяснялось в другом ответе. Или printf '%s is the value of $term\n' "$term"как ни в коем случае не следует использовать echoдля произвольных данных.
Стефан Шазелас
-2

Использование:

echo ''\$PATH'' >> output.txt 

Это будет работать

Дима Казавчинский
источник
2
пожалуйста, добавьте комментарий при голосовании с понижением
andreas-h
2
Илиec""h'''o''' ''""''\$P''A""TH''
Стефан Шазелас
Я не уверен, что пытается этот ответ. Ответ заключается в использовании \ $ или одинарных кавычек. echo '$ PATH' выведет на экран $ PATH echo '\ $ PATH' выведет \ $ PATH echo "\ $ PATH" выведет $ PATH echo '' \ $ PATH '' технически сделает правильную вещь, но две пустые строки не служат цели.
Бобпаул