การใช้"$@"
จะส่งผ่านอาร์กิวเมนต์ทั้งหมดไปยังcd
ตำแหน่งที่$1
จะส่งผ่านอาร์กิวเมนต์แรกเท่านั้น
ในตัวอย่างของคุณ
$ . cdtest.sh "r st"
ใช้งานได้ตามที่คุณส่งผ่านในอาร์กิวเมนต์เดียวเสมอ แต่ถ้าคุณผ่านการตั้งค่าสถานะเช่นกัน
$ . cdtest.sh -L "r st"
จากนั้น"$@"
จะดำเนินการอย่างถูกต้องเท่านั้นซึ่ง"$1"
จะขยายไปที่cd -L
สูญเสียไดเรกทอรีทั้งหมด
อย่างไรก็ตาม
$ . cdtest.sh r st
ล้มเหลวในทั้งสองกรณีขณะที่คุณส่งพารามิเตอร์สองตัวไปยัง cd r
และst
ไม่เป็นวิธีที่ถูกต้องในการดำเนินการ cd พารามิเตอร์จะถูกคั่นด้วยช่องว่างซึ่งจะต้องยกมา (เช่นในตัวอย่างแรกของคุณ) หรือหนี ( r\ st
) จะถือว่าเป็นหนึ่งอาร์กิวเมนต์
ในกรณีของ cd อย่างไรก็ตามมันเป็นเรื่องผิดปกติมากที่จะส่งผ่านค่าสถานะและคุณไม่สามารถส่งผ่านไปยังหลาย ๆ ไดเรกทอรีได้ดังนั้นคุณจะไม่เห็นความแตกต่างในการใช้งานจริง"$1"
หรือ"$@"
ซีดี แต่สำหรับคำสั่งอื่นคุณจะสังเกตเห็นความแตกต่างดังนั้นจึงควรใช้"$@"
เมื่อคุณต้องการสร้างฟังก์ชั่น wrapper หรือสคริปต์เช่นนี้
cd "$*"
ยังทำงานไม่ถูกต้องโดยมี arg มากกว่า 1 อัน