ความแตกต่างระหว่าง $ '$ foo' และ $“ $ foo”


9

ฉันมีปัญหาในการหาความแตกต่างระหว่างคำพูดเดียวและสองครั้งภายในบริบทของตัวแปร

ฉันกำหนด:

foo=pwd

จากนั้นเรียกใช้สิ่งเหล่านี้:

echo $'$foo'

echos ใด$foo(หมายถึง$คำสั่งแรกในคำสั่ง echo ของฉันถูกดร็อป)

echo $"$foo"

echos นี้pwd(ซึ่งหมายความว่า bash จะขยาย$foo, ตัวแปรของฉัน, เป็นค่าของมัน)

echo $`$foo`

ในที่สุด echos นี้$~/scripts(ฉันคาดว่าจะพิมพ์~/scriptsและไม่$~/scripts)

ใครสามารถช่วยฉันค้นหาความแตกต่างเหล่านี้ได้บ้าง

คำตอบ:


11

ในที่สุดคนสุดท้ายพิมพ์$~/scriptsเพราะ$`foo`เป็นการรวมกันของตัวอักษร$ตามด้วยการทดแทนคำสั่ง; ดังนั้นผู้นำ$จะถูกตีความว่าเป็นตัวอักษร$และต่อท้าย`$foo`เป็นการทดแทนคำสั่ง


ฉันลบแท็กรหัสและแทนที่ด้วยอักขระเพียง `` `` `` `และอื่น ๆ คุณสามารถย้อนกลับได้หากคุณต้องการแท็กรหัส
Tim

@Tim ขอบคุณไม่แน่ใจว่าสิ่งที่ฉันทำอย่างแน่นอน แต่ด้วยเหตุผลบางอย่างหลังจากที่คุณโพสต์แก้ไขปรากฏว่าถูกขัดจังหวะเช่นเดียวกับในการแก้ไขครั้งแรกของฉันดังนั้นฉันรีดมันกลับ ... และตอนนี้ฉันเห็นว่ามันดูโอเค ไม่แน่ใจว่าเกิดอะไรขึ้นจะทดสอบในกล่องทรายการจัดรูปแบบก่อนที่จะย้อนกลับไปที่เวอร์ชันของคุณเพราะฉันเกรงว่าฉันอาจรบกวนการโพสต์อีกครั้ง ขอบคุณสำหรับความพยายาม
kos

แน่นอนว่าไม่มีปัญหา Mine ใช้ช่องว่างที่มีความกว้างเป็นศูนย์ดังนั้นโปรดระมัดระวังเมื่อคุณแก้ไข
ทิม

2

กรณีแรก:

echo $'$foo'

echos ใด$foo(หมายถึง$คำสั่งแรกในคำสั่ง echo ของฉันถูกดร็อป)

ครั้งแรกที่$เรียกใช้เป็นคำสั่ง Echo ไม่ต้องการช่องว่างระหว่างการโต้เถียง

ดังนั้นสะท้อน$'$foo'การขยายตัวในการเรียกใช้คำสั่ง$(ซึ่งไม่ได้เป็นคำสั่งจึงไม่สนใจมัน) '$foo'แล้วสะท้อน สิ่งที่อยู่ใน''มูลค่าที่ตราไว้ - มันไม่ได้ขยายหรืออะไร คุณสามารถใส่สิ่งที่คุณต้องการใน '' และไม่มีอะไรเกิดขึ้น

หากคุณแทนที่$ด้วย$$echos ID กระบวนการ


ประการที่สอง:

echo $"$foo"

echos นี้pwd(ซึ่งหมายความว่า bash จะขยาย$foo, ตัวแปรของฉัน, เป็นค่าของมัน)

นั่นเป็นเพราะ""ไม่ได้ป้องกันไม่ให้ขยายตัว ""โดยปกติจะใช้เพื่อให้แน่ใจว่ามีค่าที่จะเปรียบเทียบ

ถ้าคุณมีตัวแปรที่อาจจะเป็นที่ว่างเปล่า (เช่นมันเป็นจากgrepผล) แล้วคุณต้องการที่จะเปรียบเทียบกับค่าอื่น / ""ตัวแปรที่คุณต้องใส่ตัวแปรแรกใน สิ่งนี้ทำให้มั่นใจได้ว่าจะมีการเปรียบเทียบการตรวจสอบอยู่เสมอแทนที่จะเป็นเพียงส่วนที่ว่างเปล่าของรหัส (ตามที่ bash เห็น) ซึ่งทำให้เกิดข้อผิดพลาด


ในที่สุดหมายเลข 3 สิ่งนี้น่าสนใจ

echo $`$foo`

เสียงสะท้อนนี้$~/scripts(ฉันคาดว่าจะพิมพ์~/scriptsและไม่$~/scripts)

นั่นเป็นเพราะ (ในกรณีนี้) เสียงสะท้อนกำลังพิมพ์$ตัวอักษรก่อน การใส่บางสิ่งลงใน backticks ทำให้ค่าของตัวแปรถูกเรียกใช้เป็นคำสั่ง (วิธีที่ดีกว่าที่จะทำใน bash รุ่นล่าสุดคือ$(command))

ดังนั้นก่อนมัน Echos $แล้วก็ขยาย​`$foo`​ไปซึ่งดำเนินการและผลตอบแทน​`pwd`​ ~/Scriptsแต่เรามี$การพิมพ์ก่อนหน้านี้ - $~/Scriptsเพื่อให้การส่งออกทั้งหมด


ทำงานได้ดีในการจัดรูปแบบที่ยากมาก!
2559

1
@Arronical Thanks :) คุณมองไม่เห็น แต่มีช่องว่างที่ไม่มีความกว้างสำหรับประโยคสุดท้าย สิ่งที่ฉันทำเพื่อจุดอินเทอร์เน็ตในจินตนาการ ... !
ทิม

1
+1 คำตอบที่ดี ฉันเพิ่งจะเพิ่มตัวแปรข้อความที่ควรจะเป็นค่าเริ่มต้นเว้นแต่คุณจะมีเหตุผลที่เฉพาะเจาะจงที่จะไม่ - ไม่เพียง แต่จะจัดการกับค่า null ที่เป็นไปได้ ดูunix.stackexchange.com/questions/171346/…สำหรับมากกว่าที่คุณอยากรู้เกี่ยวกับสิ่งนี้ ;)
Joe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.