Bash: lát các tham số vị trí


19

Làm thế nào tôi có thể có được một lát $@trong Bash mà không phải sao chép tất cả các tham số vị trí sang một mảng khác như thế này?

argv=( "$@" )
echo "${argv[@]:2}";

1
Luôn báo giá "$@". Bạn argvgán sẽ phá vỡ nếu bất kỳ đối số chứa không gian.
jordanm

Câu trả lời:


31

Bạn có thể sử dụng định dạng tương tự như đối với bất kỳ mảng nào khác. Để trích xuất các yếu tố thứ 2 và thứ 3 từ đó $@, bạn sẽ làm:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 

1
Nhưng điều này dường như hoạt động trên một char theo cơ sở char trong v4.1.2, có cách nào để thực hiện nó trên cơ sở từng từ không?
Alexej Magura

@AlexejMagura Tôi không hiểu ý bạn. Điều đó tác động đến các yếu tố của mảng. Nếu bạn có các yếu tố một ký tự, nó sẽ hoạt động "trên các ký tự". Nếu mỗi yếu tố là một từ, nó hoạt động trên các từ. Bạn có thể thử điều này trên một chuỗi và không phải là một mảng?
terdon

Tôi đang thử nó trên một bản sao của "$ @", mà tôi đoán có thể trở thành một chuỗi tại thời điểm đó, tôi không chắc chắn.
Alexej Magura

Trên bash 4.2.46, "${@:1:2}"thực sự mang lại cho tôi các đối số dòng lệnh 12 . Trong khi đó, cung cấp cho tôi các đối số dòng lệnh đầy đủ và cung cấp cho tôi tên tập lệnh theo sau là các đối số dòng lệnh đầy đủ . "${@:1}""${@:0}"
Rockallite

@Rockallite tốt, vâng. Các phần tử thứ 2 và thứ 3 của $@ mảng là đối số thứ 1 và thứ 2. "${@:1}"sẽ in toàn bộ mảng bắt đầu bằng phần tử thứ 2 (đối số thứ 1) và ${@:0}toàn bộ mảng bắt đầu từ phần tử thứ 1 là tên của tập lệnh. Bạn đã mong chờ điều gì?
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.