Bạn có thể sử dụng bashMở rộng tham số để chỉ định một phạm vi, điều này cũng hoạt động với các tham số vị trí. Đối với $3... $nnó sẽ là:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Hãy nhận ra rằng cả hai $@và $*bỏ qua các đối số đầu tiên $0. Nếu bạn tự hỏi nên sử dụng cái nào trong trường hợp của bạn: rất có thể bạn muốn trích dẫn $@. Không sử dụng $*trừ khi bạn rõ ràng không muốn các đối số được trích dẫn riêng lẻ.
Bạn có thể dùng thử như sau:
$ 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
Lưu ý rằng trong ví dụ đầu tiên $0được điền với đối số đầu tiên 0trong khi khi được sử dụng trong tập lệnh $0thay vào đó chứa đầy tên của tập lệnh, như ví dụ thứ hai hiển thị. Tên của kịch bản bashtất nhiên là đối số đầu tiên, chỉ là thông thường nó không được nhận thức như vậy - điều tương tự cũng xảy ra đối với một kịch bản được thực thi và được gọi là trực tiếp. Vì vậy, trong ví dụ đầu tiên, chúng ta có $0= 0, $1= 1vv trong khi trong lần thứ hai, nó $0= script_file, $1= 0, $2= 1vv.; ${@:3}chọn mọi đối số bắt đầu bằng $3.
Một số ví dụ bổ sung cho các phạm vi có thể:
# 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
Đọc thêm:
shiftcách tiếp cận này sẽ khiến bạn không thể truy cập$1và$2sau khi bạn chuyển chúng. Trong tập lệnh của bạn, bạn sử dụng$2cùng với$variable_in_question, bạn cần thay đổi điều đó hoặc sử dụng phương pháp Mở rộng tham số.