Como posso ecoar cifrões?

67

Por exemplo, $PATHe$HOME

Quando digito, echo $PATHele retorna meu $PATH, mas quero repetir a palavra $PATHe não o que a variável real representa, echo "$PATH"também não funciona.

Mostrar nome
fonte
sim usar aspas simples como: echo '$PATH'. Para mais informações sobre citando, visite este e este
Pandya
O @don viu apenas um erro na falha do servidor. Minha culpa.
geedoubleya
Possível duplicata de Como usar um caractere especial como um normal?
Stéphane Chazelas 14/09/16
@ StéphaneChazelas Essa pergunta é quase dois anos mais nova que esta.
DisplayName
@DisplayName, sim, mas pretende ser uma pergunta "canônica" para cobrir todos aqueles "como exibir caractere especial X". (Não tenho certeza se gosto da idéia de que essas respostas "canônicas" de cobertura geral sejam usadas para fechar perguntas específicas, motivo pelo qual acabei de adicioná-lo como um comentário em vez de uma votação apertada).
Stéphane Chazelas

Respostas:

77

Você só precisa escapar do dólar $.

echo \$PATH
$PATH

Ou coloque-o entre aspas simples:

echo '$PATH'
$PATH

Isso garantirá que a palavra não seja interpretada pelo shell.

geedoubleya
fonte
11
Obrigado, não disse nada sobre echo -ea página de manual.
DisplayName
O -esinalizador é usado para expandir, por exemplo, \tum caractere de tabulação literal. Não está relacionado a escapar do cifrão para impedir a expansão dos parâmetros.
Chepner # 16/14
2
Isso não funciona ao direcionar para um arquivo. echo '\$PATH' >> output.txtresulta em "/ usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / jogos: / usr / local / jogos: / opt / vc / bin" sendo gravados no arquivo , não "$ PATH".
Cerin
2
Muito interessante, se você estiver usando aspas simples e um caractere de escape, isso deve ecoar \ $ PATH. De qual sistema operacional / pacote é seu comando de eco?
geedoubleya
@Cerin para você @ resposta Stéphane trabalhou echo '\044*' > first.txta saída será $ * em first.txt
maq
20

$na sintaxe da maioria das conchas é um caractere muito especial. Se olharmos apenas para as conchas tipo Bourne, é usado para introduzir:

  1. expansões de parâmetros como em $#, $var,${foo:-bar}
  2. substituição de comando como em $(logname)(também ${ logname;}em alguns shells para evitar o subshell)
  3. expansão aritmética como em $((1+1))(também $[1+1]em algumas conchas).
  4. outras formas de citação em algumas conchas como $'\n'ou $"localized string".

Exceto no último caso, essas expansões / substituições ainda ocorrem entre aspas duplas (e dentro $"..."de bashou ksh93)

Para impedir que isso $seja tratado especialmente, você precisa citá-lo com:

  • aspas simples: echo '$PATH'ou echo '$'PATH. O que você geralmente deseja usar, pois escapa a todos os caracteres (exceto a si mesmo) na maioria das conchas.
  • blackslash: echo \$PATH. Também dentro de aspas duplas:echo "\$PATH"
  • em algumas conchas, algum outro operador citar: echo $'$PATH', echo $'\44PATH'(assumindo um conjunto de caracteres ASCII compatível),echo $'\u0024'

Ou verifique se não faz parte de uma forma válida de expansão, conforme listado acima:

  • echo "$"PATH
  • echo $""PATH,echo $"PATH" . Isso deve ser evitado porque algumas conchas gostam ksh93e bashsuportam a $"..."forma de aspas.
  • echo $``PATH. Não há razão para que você queira usá-lo, exceto para mostrar que é possível.
  • echo "${$+$}PATH" e outros complicados ...

Ou você pode imprimir de $outra maneira:

  • com um compatível com Unix echo: echo '\044PATH'(alguns outros echoprecisam echo -e '\044PATH')
  • printf '\44PATH\n'
  • cat << \ EOF
    $ PATH
    EOF

Observe como essas barras invertidas precisam ser citadas, pois também são especiais para o shell, obviamente.

Espero que esteja claro agora que, embora existam muitas maneiras de fazer isso, não há uma boa razão para você querer usar outra coisa, exceto echo '$PATH'aqui.

Stéphane Chazelas
fonte
1

Observe que $ dentro de aspas duplas literais podem ser um problema. Isso pode ser feito produzindo $ fora das aspas duplas, assim:

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'

RESULTADO:

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
fonte
Ou echo "$term is the value of \$term"como já explicado em outra resposta. Ou printf '%s is the value of $term\n' "$term", de qualquer maneira, não se deve usar echodados arbitrários.
Stéphane Chazelas
-2

Usar:

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

Isso vai funcionar.

Dima Kazavchinsky
fonte
2
adicione um comentário ao votar em baixa
andreas-h
2
Ouec""h'''o''' ''""''\$P''A""TH''
Stéphane Chazelas
Não tenho certeza do que está sendo tentado por esta resposta. A resposta é usar \ $ ou aspas simples. echo '$ PATH' imprimirá $ PATH echo '\ $ PATH' imprimirá \ $ PATH echo "\ $ PATH" imprimirá $ PATH echo '' \ $ PATH '' tecnicamente fará a coisa certa, mas as duas cadeias nulas não serve para nada.
bobpaul