วิธีเก็บรักษา white space ใน Bash ขัดแย้ง


2

ฉันใช้คำสั่ง:

cm1 cm2 arg1 arg2 'argument 3'

ก่อนอื่นจะไปที่cm1ซึ่งจะเปลี่ยนเส้นทางarg1 arg2 'argument 3'ไปยังไฟล์อื่น

/usr/bin/cm1:

#! /bin/bash
# some script here
shift
cm2 $@

/usr/bin/cm2:

echo $#
# This returns 4 in lieu of 3 because the white space in 'argument 3' causes the argument to be split into two arguments.

ดังนั้นฉันจะส่งผ่านข้อโต้แย้งจากสคริปต์หนึ่งไปยังอีกสคริปต์ได้อย่างไรและตรวจสอบให้แน่ใจว่าไม่มีการอ่าน white space ในฐานะตัวคั่นอาร์กิวเมนต์

คำตอบ:


3

ฉันคิดว่าคุณต้องห่อมันอีกครั้งในเครื่องหมายคำพูดเช่น:

#! /bin/bash
# some script here
shift
cm2 "$@"

ขอบคุณ! มันทำงานกับตัวอย่างง่ายๆที่ฉันให้ ตอนนี้ในสคริปต์จริงฉันกำลังเขียนโค้ดและมีการเปลี่ยนเส้นทางที่ซับซ้อนมากขึ้นข้อโต้แย้งจะแตกในบางจุด แต่นั่นหมายความว่าข้อผิดพลาดมาจากที่อื่น ... ขอบคุณ!
Françoisッ Vespa ت

อาจเป็นได้ว่าคุณแยก args เหล่านี้ในภายหลังโดยยึดตามค่าเริ่มต้นของ IFS ซึ่งค่าเริ่มต้นคือ "<space> <tab> <newline>"
Cougar

ฉันกำลังมองหาพฤติกรรมที่ตรงกันข้าม - วิธีบังคับสคริปต์ของฉันให้ทำซ้ำมากกว่าอาร์กิวเมนต์ที่คั่นด้วยช่องว่าง ในสคริปต์ของฉันฉันได้ยกการอ้างอิง ("$ @") ดังนั้นข้อโต้แย้งทั้งหมดจะถือว่าเป็นหนึ่งในสตริงที่ตัดแบ่ง ฉันแทนที่:> สำหรับเส้นทางใน "$ @" <ด้วย:> สำหรับเส้นทางใน $ @ <และทำงานได้ ขอบคุณ.
mombip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.