Bạn có thể sử dụng bash
Mở 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
... $n
nó 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 0
trong khi khi được sử dụng trong tập lệnh $0
thay 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 bash
tấ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
= 1
vv trong khi trong lần thứ hai, nó $0
= script_file
, $1
= 0
, $2
= 1
vv.; ${@: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:
shift
cách tiếp cận này sẽ khiến bạn không thể truy cập$1
và$2
sau khi bạn chuyển chúng. Trong tập lệnh của bạn, bạn sử dụng$2
cù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ố.