¿Cómo puedo hacer eco de los signos de dólar?

67

Por ejemplo, $PATHy$HOME

Cuando escribo echo $PATH, devuelve mi $PATH, pero quiero hacer eco de la palabra $PATHy no lo que representa la variable real, echo "$PATH"tampoco funciona.

Nombre para mostrar
fuente
Sí usar comillas simples como: echo '$PATH'. para obtener más información acerca de las citas, visite esto y esto
Pandya
@don solo vio un engaño en serverfault. Culpa mía.
geedoubleya
Posible duplicado de ¿Cómo usar un carácter especial como normal?
Stéphane Chazelas
@ StéphaneChazelas Esa pregunta es casi dos años más nueva que esta.
DisplayName
@DisplayName, sí, pero pretende ser una pregunta "canónica" para cubrir todos esos "cómo mostrar el carácter especial X". (No estoy seguro de que me guste la idea de que esas respuestas "canónicas" para cubrir todo se utilicen para cerrar preguntas específicas, por lo que acabo de agregarlas como un comentario en lugar de una votación cerrada).
Stéphane Chazelas

Respuestas:

77

Solo necesitas escapar del dólar $.

echo \$PATH
$PATH

O rodearlo con comillas simples:

echo '$PATH'
$PATH

Esto asegurará que la palabra no sea interpretada por el shell.

geedoubleya
fuente
1
Gracias, no decía nada echo -een la página del manual.
DisplayName
La -ebandera se usa para expandir, por ejemplo, \ta un carácter de tabulación literal. No está relacionado con escapar del signo de dólar para evitar la expansión de parámetros.
chepner
2
Esto no funciona cuando se dirige a un archivo. echo '\$PATH' >> output.txtlos resultados en "/ usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games: / opt / vc / bin" se escriben en el archivo , no "$ PATH".
Cerin
2
Muy interesante, si está usando comillas simples y un carácter escapado, entonces eso debería hacer eco de \ $ PATH. ¿De qué sistema operativo / paquete proviene su comando de eco?
geedoubleya
@Cerin for you @ stéphane la respuesta funcionó echo '\044*' > first.txt, generará $ * en first.txt
maq
20

$En la sintaxis de la mayoría de las conchas hay un carácter muy especial. Si solo miramos las conchas tipo Bourne, se usa para introducir:

  1. expansiones de parámetros como en $#, $var,${foo:-bar}
  2. sustitución de comandos como en $(logname)(también ${ logname;}en algunos shells para evitar la subshell)
  3. expansión aritmética como en $((1+1))(también $[1+1]en algunas conchas).
  4. otras formas de citar en algunos shells como $'\n'o $"localized string".

Excepto por el último caso, esas expansiones / sustituciones todavía ocurren dentro de comillas dobles (y dentro $"..."de basho ksh93)

Para evitar que $se trate especialmente, debe citarlo con:

  • comillas simples: echo '$PATH'o echo '$'PATH. El que generalmente desea usar, ya que escapa a todos los caracteres (excepto a sí mismo) en la mayoría de los shells.
  • blackslash: echo \$PATH. También entre comillas dobles:echo "\$PATH"
  • en algunas conchas, algún otro operador de citar: echo $'$PATH', echo $'\44PATH'(suponiendo un juego de caracteres ASCII compatibles),echo $'\u0024'

O asegúrese de que no sea parte de una forma válida de expansión como se enumera arriba:

  • echo "$"PATH
  • echo $""PATH,echo $"PATH" . Deben evitarse porque a algunos shells les gusta ksh93y bashadmiten la $"..."forma de comillas.
  • echo $``PATH. No hay razón por la que quieras usar esa, excepto para demostrar que es posible.
  • echo "${$+$}PATH" y otras enrevesadas ...

O podría generar eso de $otra manera:

  • con un Unix-obediente echo: echo '\044PATH'(alguna otra echonecesidad s echo -e '\044PATH')
  • printf '\44PATH\n'
  • gato << \ EOF
    $ RUTA
    EOF

Tenga en cuenta que esas barras invertidas deben citarse, ya que obviamente también son especiales para el shell.

Con suerte, debería estar claro ahora que, aunque hay muchas formas de hacerlo, no hay una buena razón por la que quiera usar otra cosa que no sea echo '$PATH'aquí.

Stéphane Chazelas
fuente
1

Tenga en cuenta que literal $ entre comillas dobles puede ser un problema. Se puede hacer produciendo $ fuera de las comillas dobles, así:

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'

SALIDA:

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
fuente
O echo "$term is the value of \$term"como ya se explicó en otra respuesta. O printf '%s is the value of $term\n' "$term"como de todos modos, uno no debería usar echopara datos arbitrarios.
Stéphane Chazelas
-2

Utilizar:

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

Esto funcionará

Dima Kazavchinsky
fuente
2
agregue un comentario cuando vote a la baja
andreas-h
2
Oec""h'''o''' ''""''\$P''A""TH''
Stéphane Chazelas,
No estoy seguro de lo que se intenta con esta respuesta. La respuesta es usar \ $ o comillas simples. echo '$ PATH' imprimirá $ PATH echo '\ $ PATH' imprimirá \ $ PATH echo "\ $ PATH" imprimirá $ PATH echo '' \ $ PATH '' técnicamente hará lo correcto, pero las dos cadenas nulas no sirve para nada.
bobpaul