คุณสามารถใช้bash
การขยายพารามิเตอร์เพื่อระบุช่วงซึ่งใช้ได้กับพารามิเตอร์ตำแหน่งเช่นกัน สำหรับ$3
... $n
มันจะเป็น:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
โปรดทราบว่าทั้งสอง$@
และละเว้นอาร์กิวเมนต์แรก$*
$0
หากคุณสงสัยว่าหนึ่งที่จะใช้ในกรณีของคุณ: มันมาก$@
น่าจะเป็นที่คุณต้องการที่ยกมา อย่าใช้$*
เว้นแต่คุณจะไม่ต้องการให้มีการเสนอราคาแบบแยกอาร์กิวเมนต์
คุณสามารถลองได้ดังนี้:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
โปรดทราบว่าในตัวอย่างแรก$0
จะเต็มไปด้วยอาร์กิวเมนต์แรก0
ในขณะที่เมื่อใช้ในสคริปต์$0
จะเต็มไปด้วยชื่อของสคริปต์แทนตามตัวอย่างที่สองแสดงให้เห็น bash
แน่นอนว่าชื่อของสคริปต์นั้นเป็นอาร์กิวเมนต์แรกซึ่งปกติแล้วมันจะไม่ถูกมองว่าเป็นเช่นนั้น - เหมือนกันสำหรับสคริปต์ที่ทำให้สามารถเรียกใช้งานได้และเรียกว่า“ โดยตรง” ดังนั้นในตัวอย่างแรกเรามี$0
= 0
, $1
= 1
ฯลฯ ในขณะที่ในวินาทีมันคือ$0
= script_file
, $1
= 0
, $2
= 1
ฯลฯ เลือกอาร์กิวเมนต์ทุกที่เริ่มต้นด้วย${@:3}
$3
ตัวอย่างเพิ่มเติมสำหรับช่วงที่เป็นไปได้:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
อ่านเพิ่มเติม:
shift
วิธีการที่จะทำให้มันเป็นไปไม่ได้ที่จะเข้าถึง$1
และ$2
หลังจากที่คุณเปลี่ยนพวกเขา ในสคริปต์ของคุณคุณใช้$2
ควบคู่ไปกับ$variable_in_question
คุณต้องเปลี่ยนหรือใช้วิธีการขยายพารามิเตอร์