ความแตกต่างระหว่าง doublequotes“”, singlequotes '' และ backticks `` บน commandline หรือไม่?


43

ฉันมักจะเห็นบทช่วยสอนบนเว็บหรือโพสต์บนเว็บไซต์ซึ่งใช้ตัวอักษรต่อไปนี้ที่บรรทัดคำสั่ง บ่อยครั้งที่ดูเหมือนว่าพวกเขาจะใช้เพื่อวัตถุประสงค์ที่คล้ายกันสวย อะไรคือความแตกต่างระหว่างสิ่งเหล่านี้เมื่อใช้กับบรรทัดคำสั่งหรือสำหรับการเขียนโปรแกรมเชลล์? ฉันจะใช้สิ่งใดในจุดประสงค์ใด

" " double quotes

' ' single quotes

` ` backticks

คำตอบ:


43

เพื่อเป็นตัวอย่างให้พิจารณาว่าตัวแปรนั้นfooมีuname( foo=uname)

  • echo "$foo"เอาท์พุทunameตัวแปรแทนที่ในข้อความ
    • สำหรับตัว$อักษรใน"เครื่องหมายคำพูดให้ใช้\$; สำหรับตัวอักษรใช้"\"
  • echo '$foo'เอาต์พุต$fooสตริงที่แน่นอน
    • แม้'จะไม่สามารถหลบหนีได้เหมือนคำพูด\'ภายใน แต่คุณสามารถใช้''foo'\''bar'
  • echo `$foo`เอาท์พุทLinuxดำเนินการเนื้อหาของตัวแปรและechoการพิมพ์

\จะถือว่าเสมอตัวอักษรเมื่อล้อมรอบในราคาเดียวถึงแม้ว่ามันจะแจ๋ว 'หลังจากการเปิดตัว'รายการถัดไป'จะถูกตีความเป็นเครื่องหมายคำพูดปิดเสมอ บางอย่างเช่นการอ้างถึง'ในสตริงที่ยกมาเดี่ยวสามารถทำได้โดยการจบการพูดการหลบหนีเป็น'รายบุคคลและเริ่มต้นการอ้างอิงอีกครั้ง นั่นคือแม้ว่า\'จะไม่ทำงานระหว่างการเปิดและปิด'อักขระ'\''แต่ (ดูการแก้ไขGillesของหนึ่งในโพสต์ของฉันเมื่อฉันทำผิดพลาดเหมือนกันสำหรับรายละเอียด.)
Eliah Kagan

11

นี่คือคำอธิบายอย่างมากในส่วนที่เกี่ยวข้องของคู่มือทุบตี สั้น ๆ ทุกสิ่งที่อยู่ในเครื่องหมายคำพูดจะถูกตีความอย่างแท้จริง ตัวอย่างเช่น:

$ echo '$SHELL'
$SHELL
$ echo '{1..3}'
{1..3}

เปรียบเทียบกับรุ่นที่ไม่มีเครื่องหมาย:

$ echo $SHELL
/bin/bash
$ echo {1..3}
1 2 3

เครื่องหมายอัญประกาศคู่ช่วยให้สามารถขยายตัวแปรได้ (เช่นการขยายประวัติและบางอย่าง) โดยทั่วไปคุณจะใช้มันเมื่อคุณจัดการกับสิ่งที่คุณต้องการเห็นแบบขยาย ตัวอย่างเช่น:

$ echo "$SHELL"
/bin/bash
$ echo "!!"
echo "echo "$SHELL""
echo /bin/bash

กล่าวอีกนัยหนึ่งอัญประกาศสมบูรณ์ป้องกันสตริงจากเชลล์ในขณะที่อัญประกาศคู่ปกป้องบางสิ่ง (ช่องว่างตัวอย่าง) แต่อนุญาตให้ตัวแปรและอักขระพิเศษที่จะขยาย / ตีความอย่างถูกต้อง


1
ไม่แน่ใจว่า OP ถูกเปลี่ยนไปตามข้อเท็จจริงหรือไม่ แต่คำตอบนี้ไม่ได้กล่าวถึง backticks?
Alexander Mills

5

เครื่องหมายคำพูดเดี่ยว ( '') ใช้เพื่อเก็บรักษาค่าตัวอักษรของอักขระแต่ละตัวที่อยู่ในเครื่องหมายคำพูด

การใช้เครื่องหมายคำพูดคู่ ( "") ค่าตัวอักษรของอักขระทั้งหมดที่อยู่ในนั้นจะถูกเก็บไว้ยกเว้นเครื่องหมายดอลลาร์ ( $), backticks (เครื่องหมายคำพูดเดี่ยวย้อนหลัง``) และเครื่องหมายแบ็กสแลช ( \)

เมื่อใส่ไว้ใน back-ticks ( ``) เชลล์จะตีความสิ่งที่หมายถึง "ผลลัพธ์ของคำสั่งภายใน back-ticks" สิ่งนี้เรียกว่า "การทดแทนคำสั่ง" เนื่องจากเอาต์พุตของคำสั่งถูกแทนที่สำหรับคำสั่งเอง

อ้างอิง:


3
echo '$HOME' is "$HOME"

เครื่องหมายคำพูดเดี่ยวป้องกันการขยายตัวของตัวแปรในขณะที่เครื่องหมายคำพูดคู่อนุญาต


2

ฉันแค่พูดโดยทั่วไป แต่:

""- ใช้ในการประมวลผลข้อมูลบางส่วนก่อนส่งออก (เหมือนใน PHP)

  • ตัวอย่างเช่น: name=NESS; echo "Hello my name is $name"จะส่งออก:Hello my name is NESS

''- ใช้เพื่อแสดงผลตามที่มันเป็น (เช่นใน PHP)

  • โดยใช้ตัวอย่างด้านบนมันจะออก Hello my name is $name

ดังนั้นความแตกต่างระหว่างเครื่องหมายคำพูดคู่และคำเดี่ยวคือเครื่องหมายคำพูดคู่จะประมวลผลตัวแปรและแสดงค่าในขณะที่เครื่องหมายคำพูดเดี่ยวแสดงชื่อของตัวแปรโดยไม่ต้องประมวลผล

`` - ใช้เพื่ออ้างคำสั่งที่กำหนดให้กับตัวแปรอื่นในภายหลัง


1

อัญประกาศเดี่ยวล้อมรอบค่าที่จะต้องดำเนินการอย่างแท้จริง: การขยายตัวทุกประเภทจะถูกระงับ มักจะใช้ในกรณีที่มูลค่ารวมหรืออาจรวมถึงพื้นที่สีขาว (ช่องว่าง, แท็บบรรทัดใหม่) หรืออักขระพิเศษ ( $, \, `) ที่ผู้ใช้ไม่ต้องการที่จะขยาย / ได้รับการปฏิบัติเป็นพิเศษโดยเปลือก

เครื่องหมายอัญประกาศคู่ล้อมรอบค่าซึ่งจะมีตัวแปรและการแทนที่อักขระเสร็จแล้ว จำเป็นเมื่อเอาต์พุตอาจมีช่องว่างและต้องกำหนดเป็นค่าเดียว

เครื่องหมายคำพูดย้อนกลับล้อมรอบคำสั่งผลลัพธ์ที่ต้องการเป็นค่า เปลือกหอยที่ใหม่กว่าอนุญาตให้ใช้ในสถานที่ของ$(...) `...`ฉันชอบวิธีที่ใหม่กว่า

รหัสต่อไปนี้อาจช่วยให้เข้าใจสิ่งที่เกิดขึ้น

CMD = 'ls.'
echo sq: $ CMD
ตั้งค่า $ CMD
echo raw 1: $ 1
echo raw: $ *
ตั้งค่า "$ CMD"
echo dq: $ 1
echo bq: `$ CMD`
echo ใหม่: $ ($ CMD)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.