ฉันอ่านเกี่ยวกับว่าฉันควรอ้างอิงตัวแปรใน bash เช่น "$ foo" แทนที่จะเป็น $ foo อย่างไรก็ตามในขณะที่เขียนสคริปต์ฉันพบกรณีที่ใช้ได้โดยไม่ต้องใส่เครื่องหมายคำพูด แต่ไม่ใช่กับพวกเขา:
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
อันนี้ใช้ได้ผล:
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
อันนี้ไม่ (บันทึกคำพูดคู่ aroung $ wget_options):
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
อะไรคือสาเหตุของสิ่งนี้?
บรรทัดแรกเป็นเวอร์ชั่นที่ดี; หรือฉันควรสงสัยว่ามีข้อผิดพลาดที่ซ่อนอยู่ที่ไหนสักแห่งที่ทำให้เกิดพฤติกรรมนี้?
โดยทั่วไปแล้วฉันจะหาเอกสารที่ดีได้ที่ไหนเพื่อทำความเข้าใจวิธีการทุบตีและการอ้างอิง ในระหว่างการเขียนบทนี้ฉันรู้สึกว่าฉันเริ่มทำงานบนฐานการทดลองและข้อผิดพลาดแทนที่จะเข้าใจกฎ
wget
ไม่รู้ว่าอะไร--mirror --no-host-directories
(เป็นหนึ่งอาร์กิวเมนต์) แต่มันจัดการเมื่อแบ่งออกเป็นสองอาร์กิวเมนต์ โปรแกรมน้อยมากที่รักษาช่องว่างและคำพูดเป็นพิเศษเมื่อพวกเขาอยู่ในเวกเตอร์อาร์กิวเมนต์ ปัญหาคือว่าbash
และกระสุนอื่น ๆ มีความหมายเป็น>
bash
ทำได้ดังนั้นคุณสามารถจินตนาการ$a
ได้ว่าเทียบเท่ากับการเขียนเนื้อหาโดยตรง ตอนนี้ปัญหาชัดเจน: a="-a -b"; cmd "$a"
ขยายไปcmd "-a -b"
แต่cmd
อาจไม่รู้ว่าแปลว่าอะไร cmd $a
ขยายไปcmd -a -b
ซึ่งอาจไม่ทำงาน