คุณสามารถใช้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คุณต้องเปลี่ยนหรือใช้วิธีการขยายพารามิเตอร์