ฉันจะสะท้อนสัญญาณดอลลาร์ได้อย่างไร


67

ตัวอย่างเช่น$PATHและ$HOME

เมื่อฉันพิมพ์echo $PATHมันจะส่งกลับของฉัน$PATHแต่ฉันต้องการที่จะสะท้อนคำ$PATHและไม่ใช่สิ่งที่ตัวแปรจริงหมายถึงecho "$PATH"ไม่ได้ทำงานอย่างใดอย่างหนึ่ง


echo '$PATH'ใช่ใช้คำพูดเดียวที่ชอบ: สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการอ้างอิงโปรดไปที่นี่และสิ่งนี้
Pandya

@don เห็นเฉพาะ dupe บน serverfault ความผิดฉันเอง.
geedoubleya


@ StéphaneChazelasคำถามนั้นเกือบสองปีใหม่กว่านี้
DisplayName

@DisplayName ใช่ แต่มีวัตถุประสงค์เป็นคำถาม "บัญญัติ" เพื่อครอบคลุมทั้งหมด "วิธีการที่ฉันแสดงอักขระพิเศษ X" (ฉันไม่แน่ใจว่าฉันชอบความคิดของคำตอบที่ครอบคลุม "บัญญัติ" เหล่านั้นถูกใช้เพื่อปิดคำถามเฉพาะซึ่งเป็นเหตุผลที่ฉันเพิ่งเพิ่มมันเป็นความคิดเห็นแทนการลงคะแนนอย่างใกล้ชิด)
Stéphane Chazelas

คำตอบ:


77

คุณเพียงแค่ต้องหลบหนีดอลล่า$ร์:

echo \$PATH
$PATH

หรือล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยว:

echo '$PATH'
$PATH

สิ่งนี้จะทำให้แน่ใจได้ว่าคำศัพท์จะไม่ถูกตีความโดยเชลล์


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 / เกม: / opt / vc / bin" ถูกเขียนลงไฟล์ ไม่ใช่ "$ PATH"
Cerin

2
น่าสนใจมากถ้าคุณใช้เครื่องหมายคำพูดเดี่ยวและตัวละครที่มีการหลบหนีนั่นอาจเป็นเพียงแค่สะท้อน \ $ PATH echo comand ของคุณมาจาก OS / แพ็คเกจใด?
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โดยทั่วไปแล้วสิ่งที่คุณต้องการใช้ในขณะที่มันจะหนีออกจากตัวละครทุกตัว (ยกเว้นตัวมันเอง) ในเชลล์ส่วนใหญ่
  • echo \$PATHblackslash: นอกจากนี้ภายในเครื่องหมายคำพูดคู่:echo "\$PATH"
  • ในเชลล์บางตัวโอเปอเรเตอร์การอ้างอิงอื่น ๆ : echo $'$PATH', echo $'\44PATH'(สมมติว่าชุดอักขระที่เข้ากันได้กับ ASCII)echo $'\u0024'

หรือตรวจสอบให้แน่ใจว่าไม่ได้เป็นส่วนหนึ่งของรูปแบบการขยายที่ถูกต้องตามที่ระบุข้างต้น:

  • echo "$"PATH
  • echo $""PATH,echo $"PATH" . ควรหลีกเลี่ยงเพราะเชลล์บางตัวชอบksh93และbashสนับสนุน$"..."รูปแบบของคำพูด
  • echo $``PATH. ไม่มีเหตุผลที่คุณต้องการใช้อันนั้นยกเว้นเพื่อแสดงว่าเป็นไปได้
  • echo "${$+$}PATH" และสิ่งที่ซับซ้อนอื่น ๆ ...

หรือคุณสามารถเอาท์พุทแบบ$อื่นได้:

  • กับ Unix-compliant 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

หรือecho "$term is the value of \$term"ตามที่อธิบายไว้แล้วในคำตอบอื่น หรือprintf '%s is the value of $term\n' "$term"อย่างใดอย่างหนึ่งไม่ควรใช้echoสำหรับข้อมูลโดยพลการ
Stéphane Chazelas

-2

ใช้:

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

สิ่งนี้จะได้ผล


2
โปรดเพิ่มความคิดเห็นเมื่อลงคะแนน
andreas-h

2
หรือec""h'''o''' ''""''\$P''A""TH''
Stéphane Chazelas

ฉันไม่แน่ใจว่าคำตอบนี้พยายามทำอะไร คำตอบคือใช้ \ $ หรือเครื่องหมายคำพูดเดี่ยว echo '$ PATH' จะพิมพ์ $ PATH echo '\ $ PATH' จะพิมพ์ \ $ PATH echo "\ $ PATH" จะพิมพ์ $ PATH echo '' \ $ PATH '' ในทางเทคนิคจะทำในสิ่งที่ถูกต้อง แต่ทั้งสองสตริงว่าง ไม่มีวัตถุประสงค์
bobpaul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.