Jak mogę powtórzyć znaki dolara?

67

Na przykład $PATHi$HOME

Kiedy piszę echo $PATH, zwraca moje $PATH, ale chcę powtórzyć słowo, $PATHa nie to, co oznacza rzeczywista zmienna, echo "$PATH"też nie działa.

Wyświetlana nazwa
źródło
Tak używać apostrof jak: echo '$PATH'. Aby uzyskać więcej informacji na temat cytowania, odwiedź to i to
Pandya
@don widział tylko błąd przy błędzie serwera. Mój błąd.
geedoubleya
Możliwy duplikat Jak używać znaku specjalnego jako normalnego?
Stéphane Chazelas,
@ StéphaneChazelas To pytanie jest prawie dwa lata nowsze od tego.
DisplayName,
@DisplayName, tak, ale ma na celu „kanoniczne” pytanie obejmujące wszystkie te „jak wyświetlić znak specjalny X”. (Nie jestem pewien, czy podoba mi się pomysł, że te „kanoniczne” odpowiedzi na wszystkie pytania są używane do zamykania konkretnych pytań, dlatego właśnie dodałem je jako komentarz zamiast ścisłego głosowania).
Stéphane Chazelas

Odpowiedzi:

77

Musisz tylko uciec przed dolarem $.:

echo \$PATH
$PATH

Lub otocz go pojedynczymi cytatami:

echo '$PATH'
$PATH

To zapewni, że słowo nie zostanie zinterpretowane przez powłokę.

geedoubleya
źródło
1
Dzięki, echo -ena stronie podręcznika nic nie było powiedziane .
DisplayName
-eFlaga jest stosowany w celu rozszerzenia, na przykład, \tdo dosłownego znaku tabulacji. Nie ma to związku z ucieczką od znaku dolara, aby zapobiec rozszerzaniu parametrów.
chepner
2
Nie działa to podczas przekierowywania do pliku. echo '\$PATH' >> output.txtpowoduje zapisanie do pliku „/ usr / local / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games: / usr / local / games: / opt / vc / bin” , a nie „$ PATH”.
Cerin,
2
Bardzo interesujące, jeśli używasz pojedynczych cudzysłowów i znaku zmiany znaczenia, powinno to po prostu wywołać echo \ $ PATH. Z jakiego systemu operacyjnego / pakietu pochodzi twoja komenda echa?
geedoubleya
@Cerin dla ciebie @ stéphane odpowiedź zadziałała echo '\044*' > first.txt, da wynik $ * w first.txt
maq
20

$w składni większości powłok jest bardzo szczególny znak. Jeśli spojrzymy tylko na powłoki podobne do Bourne'a, używa się go do wprowadzenia:

  1. parametrów ekspansji, jak w $#, $var,${foo:-bar}
  2. zastępowanie poleceń jak w $(logname)(również ${ logname;}w niektórych powłokach, aby uniknąć podpowłoki)
  3. interpretacja arytmetyczna jak w $((1+1))(także $[1+1]w niektórych powłokach).
  4. inne formy cytowania w niektórych powłokach, takie jak $'\n'lub $"localized string".

Z wyjątkiem ostatniego przypadku te rozszerzenia / podstawienia nadal występują w podwójnych cudzysłowach (i wewnątrz $"..."w bashlub ksh93)

Aby $nie traktować tego specjalnie, musisz zacytować to za pomocą:

  • pojedyncze cytaty: echo '$PATH'lub echo '$'PATH. Ten, którego zazwyczaj chcesz używać, ponieważ unika wszystkich znaków (oprócz siebie) w większości powłok.
  • blackslash: echo \$PATH. Również w podwójnych cudzysłowach:echo "\$PATH"
  • w niektórych muszli, jakiś inny operator przytoczyć: echo $'$PATH', echo $'\44PATH'(zakładając kompatybilnego zestawu znaków ASCII),echo $'\u0024'

Lub upewnij się, że nie jest to część prawidłowej formy rozszerzenia wymienionej powyżej:

  • echo "$"PATH
  • echo $""PATH,echo $"PATH" . Tych należy unikać, ponieważ niektóre powłoki lubią ksh93i bashobsługują $"..."formę cytatów.
  • echo $``PATH. Nie ma powodu, dla którego chcesz tego użyć, poza pokazaniem, że jest to możliwe.
  • echo "${$+$}PATH" i inne zawiłe ...

Lub możesz wydrukować to w $inny sposób:

  • z zgodnym z Uniksem echo: echo '\044PATH'(niektóre inne echopotrzeby echo -e '\044PATH')
  • printf '\44PATH\n'
  • kot << \ EOF
    ŚCIEŻKA $
    EOF

Zwróć uwagę, jak należy cytować te ukośniki odwrotne, ponieważ są one oczywiście wyjątkowe dla powłoki.

Mam nadzieję, że do tej pory powinno być jasne, że chociaż istnieje wiele sposobów na zrobienie tego, nie ma żadnego dobrego powodu, dla którego chciałbyś użyć czegokolwiek innego niż echo '$PATH'tutaj.

Stéphane Chazelas
źródło
1

Zauważ, że dosłowne $ wewnątrz podwójnych cudzysłowów może stanowić problem. Można to zrobić, generując $ poza podwójnymi cudzysłowami, jak poniżej:

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'

WYNIK:

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
źródło
Lub echo "$term is the value of \$term"jak już wyjaśniono w innej odpowiedzi. Lub printf '%s is the value of $term\n' "$term"jak zresztą nie należy używać echodo dowolnych danych.
Stéphane Chazelas,
-2

Posługiwać się:

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

To zadziała.

Dima Kazavchinsky
źródło
2
dodaj komentarz podczas głosowania w dół
andreas-h
2
Lubec""h'''o''' ''""''\$P''A""TH''
Stéphane Chazelas
Nie jestem pewien, co próbuje uzyskać odpowiedź. Odpowiedzią jest użycie \ $ lub pojedynczych cudzysłowów. echo „$ PATH” wypisze $ PATH echo „\ $ PATH” wypisze \ $ PATH echo „\ $ PATH” wypisze $ PATH echo „\ $ PATH” technicznie zrobi właściwą rzecz, ale dwa ciągi zerowe nie służą celowi.
bobpaul,