เปลือกของคุณจะถูกแปลความหมายของคำพูดทั้งสอง'
และก่อนที่พวกเขาจะได้รับการ"
echo
โดยทั่วไปฉันแค่ใส่เครื่องหมายคำพูดคู่รอบอาร์กิวเมนต์ของฉันเพื่อสะท้อนแม้ว่าพวกเขาจะไม่จำเป็น; ตัวอย่างเช่น:
$ echo "Hello world"
Hello world
ดังนั้นในตัวอย่างแรกของคุณหากคุณต้องการรวมเครื่องหมายคำพูดตามตัวอักษรในผลลัพธ์ของคุณพวกเขาจะต้องหลบหนี:
$ echo \'Hello world\'
'Hello world'
หรือจำเป็นต้องใช้ภายในอาร์กิวเมนต์ที่มีการเสนอราคาอยู่แล้ว (แต่ไม่สามารถเป็นราคาแบบเดียวกันได้หรือคุณจะต้องหลีกหนีไปก่อน):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
ในตัวอย่างที่สองของคุณคุณกำลังรันการทดแทนคำสั่งตรงกลางสตริง:
grep $ARG /var/tmp/setfile | awk {print $2}
สิ่งที่เริ่มต้นด้วย$
จะได้รับการจัดการเป็นพิเศษโดยเชลล์ - มันปฏิบัติต่อพวกเขาเป็นตัวแปรและแทนที่พวกเขาด้วยค่าของพวกเขา เนื่องจากส่วนใหญ่แล้วตัวแปรเหล่านั้นไม่ได้ตั้งค่าไว้ในเชลล์ของคุณ
grep /var/tmp/setfile | awk {print}
เนื่องจากgrep
เห็นเพียงอาร์กิวเมนต์เดียวมันจะถือว่าอาร์กิวเมนต์นั้นเป็นรูปแบบที่คุณค้นหาและสถานที่ที่ควรอ่านข้อมูลจากนั้นคือ stdin ดังนั้นจึงบล็อกการรออินพุต นั่นเป็นเหตุผลว่าทำไมคำสั่งที่สองของคุณจึงปรากฏขึ้น
สิ่งนี้จะไม่เกิดขึ้นหากคุณอ้างอาร์กิวเมนต์เพียงครั้งเดียว (ซึ่งเป็นเหตุผลว่าทำไมตัวอย่างแรกของคุณเกือบจะทำงานได้) ดังนั้นนี่เป็นวิธีหนึ่งในการรับผลลัพธ์ที่คุณต้องการ:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
คุณยังสามารถใส่เครื่องหมายอัญประกาศคู่ได้ แต่จากนั้นคุณจะต้องหลีกเลี่ยง$
s เพื่อให้เชลล์ไม่สามารถแก้ไขมันเป็นตัวแปรได้และ backticks เพื่อให้เชลล์ไม่รันการทดแทนคำสั่งทันที:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"