ดูเหมือนว่าคำสั่งของคุณอาจตั้งค่าตัวแปรสภาพแวดล้อมตามอาร์กิวเมนต์ที่กำหนดไว้ในบรรทัดคำสั่ง อาจเป็นได้:
CLUSTER=cl1; cluster=$CLUSTER command
... และตั้งค่าสภาพแวดล้อมสำหรับการเรียกใช้
มิฉะนั้นคำพูดของเชลล์จะกำหนดขอบเขตอาร์กิวเมนต์หรือยกเว้นอักขระเชลล์พิเศษอื่น ๆ จากการตีความเชลล์ คุณสามารถมี(และดังนั้นการหลบหนี)ชนิดของอัญประกาศเชลล์ภายในชนิดอื่น ๆ ตามกฎต่าง ๆ :
"''''"
- สตริงที่ยกมานุ่มสามารถมีจำนวนของคำพูดยาก
"\""
- \
เครื่องหมายแบ็กสแลชสามารถหนีเครื่องหมาย"
คำพูด"
นุ่มนวลภายในสตริงที่ยกมานุ่ม
- ในบริบทนี้
\\
แบ็กสแลชจะหนีออกไปเอง\$
โทเค็นการขยายและ\n
ewlines ดังที่ระบุไว้ด้านล่าง
"${expand} and then some"
- สตริงที่ยกมานุ่มสามารถมีการ$
ขยายตัวเปลือกตีความ
'"\'
- '
สตริงที่ยกมายากสามารถมีตัวละครอื่น ๆ นอกเหนือจาก'
อ้างยาก
\
- เครื่องหมายแบ็กสแลชที่ไม่ได้ใส่เครื่องหมายอัญประกาศจะหนีอักขระต่อไปนี้สำหรับการตีความตามตัวอักษร - แม้แต่เครื่องหมายแบ็กสแลชตัวอื่น - ยกเว้น\n
ewline
- ใน
\\n
กรณี ewline ทั้ง\
แบ็กสแลชและ\n
ewline จะถูกลบออกอย่างสมบูรณ์จากคำสั่งที่แปลผลลัพธ์
${parameter+expand "$parameter"}
- คำพูดที่เกิดจากการขยายตัวของเชลล์แทบจะไม่เคยทำหน้าที่เป็นตัวคั่นเครื่องหมายยกเว้นบางกรณีพิเศษ ฉันจะไม่กล้าอธิบายเพิ่มเติมที่นี่
ฉันคิดว่ามันแปลกที่แอปพลิเคชันใด ๆ จะตีความคำพูดใน args บรรทัดคำสั่ง การฝึกฝนเช่นนี้ไม่สมเหตุสมผลนัก - สำหรับกระสุนอย่างน้อย - วัตถุประสงค์หลักของการเสนอราคาโดยทั่วไปคือการกำหนดขอบเขตการโต้แย้ง อย่างไรก็ตามเมื่อมีการร้องขออาร์กิวเมนต์จะถูกคั่นด้วย\0NUL
อักขระอยู่เสมอดังนั้นการเสนอราคาจึงไม่สามารถให้บริการได้มากนัก
แม้แต่เชลล์ก็มักจะรำคาญที่จะตีความคำพูดในหนึ่งในข้อโต้แย้งการภาวนาเมื่อมันถูกเรียกว่ามี-c
สวิตช์ - ซึ่งหมายถึงว่าตัวถูกดำเนินการครั้งแรกของมันคือเชลล์สคริปต์ที่จริงแล้วมันควรทำงานเมื่อมีการร้องขอ นี่เป็นกรณีของอินพุตที่ประเมินสองครั้ง
จากทั้งหมดที่กล่าวมาคุณสามารถทำสิ่งต่าง ๆ เพื่อส่งคำพูดตามตัวอักษรผ่านการขัดแย้งในบรรทัดคำสั่ง ตัวอย่างเช่น:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
ดังที่ฉันได้บันทึกไว้ในความคิดเห็นก่อนหน้านี้คุณสามารถใส่"
เครื่องหมายคำพูดไว้ในส่วนขยายที่"
เสนอราคาได้
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
คุณสามารถหลบหนี"
ด้วย\
แบ็กสแลชภายใน"
สตริงที่ยกมา
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
คุณสามารถสลับและ concatenate quoting รูปแบบที่จะมาถึงผลลัพธ์ที่คุณต้องการเป็น @jimmij บันทึกดังกล่าวข้างต้น
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
คุณสามารถปิดการใช้งานทั้งการสร้างชื่อไฟล์และการ$IFS
แยก - เพื่อหลีกเลี่ยงความจำเป็นที่จะต้องอ้างคำพูด$expansion
ทั้งหมด - และเพื่ออ้างคำพูดเท่านั้น นี่อาจจะเกินเลยไป
สุดท้ายมี shell-quote ประเภทอื่นที่อาจใช้ ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้sh -c "$scriptlet"
รูปแบบของการเรียกใช้เชลล์มักจะใช้เพื่อจัดเตรียมสคริปต์ของเชลล์ในบรรทัดคำสั่ง เมื่อ$scriptlet
ได้รับความซับซ้อนแม้ว่า - เช่นเมื่อคำพูดต้องมีคำพูดอื่น ๆ - มันมักจะเป็นประโยชน์ในการใช้ที่นี่เอกสารและsh -s
แทน - ที่เชลล์ได้รับคำสั่งโดยเฉพาะเพื่อกำหนดตัวถูกดำเนินการต่อไปนี้ทั้งหมดให้กับพารามิเตอร์ตำแหน่งตามที่มันจะทำใน-c
กรณี stdin
และยังจะยังใช้สคริปต์จาก
หากคำสั่งของคุณต้องตีความคำพูดด้วยวิธีนี้ฉันจะพิจารณาให้ดีกว่าถ้ามันสามารถทำได้ในอินพุตไฟล์ ตัวอย่างเช่น:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
หากคุณไม่ได้อ้างถึงตัวคั่นของเนื้อหา<<here-document
นั้นทั้งหมดจะได้รับการปฏิบัติเกือบจะเหมือนกัน"
กับคำพูดแบบนุ่ม - ยกเว้นว่า"
คำพูดสองครั้งจะไม่ได้รับการปฏิบัติเป็นพิเศษ ดังนั้นถ้าเราเรียกใช้ข้างต้นด้วยcat
แทน:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... มันพิมพ์ ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"