วิธี echo `single quote` เมื่อใช้ single quote เพื่อห่ออักขระพิเศษใน shell?


26

ฉันกำลังอ่านบทเรียนเกี่ยวกับเชลล์วันนี้จากhttp://www.tutorialspoint.com/unix/unix-quoting-mechanisms.htm

ซึ่งกล่าวถึง:

หากการเสนอราคาเดียวปรากฏขึ้นภายในสตริงที่จะส่งออกคุณไม่ควรใส่สตริงทั้งหมดภายในเครื่องหมายคำพูดเดียวแทนคุณจะต้องนำการ backslash () ดังต่อไปนี้:

echo 'It\'s Shell Programming'

ฉันลองสิ่งนี้บนเซิร์ฟเวอร์ centos ของฉันมันไม่ทำงานขอ>ให้ฉันพิมพ์อีกมาก

ผมสงสัยว่าตั้งแต่สองราคาเดียวเปลี่ยนทุกตัวอักษรพิเศษเป็นตัวอักษรปกติซึ่งรวมถึงสัญลักษณ์หลบหนี\แต่ไม่รวมตัวเอง',
วิธีการที่ฉันควรจะเป็นตัวแทนคำพูดเดียวเดียว'ในวลีเดียวที่ยกมา?


1
ทำไมไม่ใช้echo It\'s Shell Programmingหรือecho "It's Shell Programming"?
cuonglm

@conglm เพราะฉันอาจใช้วลีเช่นecho Wow, I'm going to have lots of $$$$$$ now
Zen

2
ดังนั้นคุณควรใช้เครื่องหมายคำพูดคู่และหลบหนี$ด้วย สิ่งที่ชอบecho Wow, I\'m going to have lots of \$\$\$\$\$\$ nowหรือเพียงแค่echo Wow, I\'m going to have lots of '$$$$$$' now
cuonglm

@cuonglm ใช่ฉันทำได้และฉันรู้ว่าฉันจะทำอย่างไร แต่ดูเหมือนว่าบทช่วยสอนที่ฉันอ่านมามีความมั่นใจเกี่ยวกับว่ามีวิธีที่จะหลีกเลี่ยงคำพูดเดียวในวลีที่ยกมาเดี่ยว แต่ตัวอย่างที่ให้มาของบทช่วยสอนไม่ทำงาน ดังนั้นฉันสงสัยว่าบางคนอาจรู้วิธีแก้ปัญหา
Zen

1
แล้วเรื่องนี้ล่ะ echo 'It'"'"'s Shell Programming'. ฉันแค่แบ่งมันเป็น 3 สายตัวแรกและตัวสุดท้ายล้อมรอบด้วยเครื่องหมายคำพูดเดี่ยว แต่ตัวคั่นกลางมีคำพูดเดี่ยวล้อมรอบด้วยเครื่องหมายคำพูดคู่
jcbermu

คำตอบ:


49

การสอนไม่ถูกต้อง

POSIXพูดว่า:

คำพูดเดียวไม่สามารถเกิดขึ้นได้ในคำพูดเดียว

นี่คือทางเลือก:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

อ่านเพิ่มเติม: Quotes - Greg's Wiki


4
อีกหนึ่ง: echo 'It''s Shell Programming'- zsh พร้อมrc_quotesชุดตัวเลือก (และเชลล์ rc ด้วย) - คู่ของคำพูดเดี่ยวในเครื่องหมายคำพูดเดียวหมายถึงคำพูดเดียว
Michał Politowski

5
บางครั้งฉันใช้q="'"และqq='"'ทำให้เครื่องนี้สะอาดขึ้น สิ่งนี้จะช่วยให้echo "It${q}s ${qq}Shell Programming${qq}"(จำเป็นต้องใช้เครื่องหมายปีกกาในการต่อท้ายตัวอักษร) POSIX ปลอดภัย เลเยอร์ด้านนอกจะต้องมีการเสนอราคาสองครั้ง
Adam Katz

1

คุณสามารถใช้ได้:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

หากต้องการเชลล์อย่างปลอดภัยเสนอราคาบรรทัดต่อบรรทัด

เชลล์ขึ้นอยู่กับว่าคุณอาจมีตัวเลือกให้ทำ:

printf %q\\n "$arbitrary_value"

แม้ว่าฉันมักจะชอบทำ:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

วิธีการด้วยตนเองเพิ่มเติมอาจมีลักษณะ:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... ซึ่งอย่างน้อยก็เป็นแบบไม่มีส้อม


1
ฉันไม่มีความคิดเกี่ยวกับสิ่งที่คุณกำลังพูดถึงโดยสิ้นเชิงยกเว้นวลีที่ว่าprintf %q\\n "$arbitrary_value"คนอื่นจะซับซ้อนเกินไป
Zen

1

ในกรณีที่มีคนอื่นมารวมกันเพื่อใส่เครื่องหมายคำพูดเดี่ยวและคู่ลงในไฟล์สิ่งนี้ก็ใช้ได้เช่นกัน:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

ทุกสิ่งที่เชลล์อาจเห็นว่าเป็นตัวแปร แต่จะต้องหลีกเลี่ยงโดยแบ็กสแลช:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.