$ {@: 2} này có nghĩa là gì trong kịch bản shell


27

Tôi thấy điều này trong một kịch bản shell.

variable=${@:2}

Nó đang làm gì vậy


Đó có phải là chính xác như thế nào nó được hiển thị trong kịch bản? Cú pháp trông giống như một mảng nhưng thiếu một số phần. Bạn có thể vui lòng gửi một vài dòng xung quanh dòng này từ kịch bản không?
slm

Đó là một biến bắt đầu từ chữ cái thứ hai. var="my_value"; echo var="${var[@]:2}"; echo "$var"Thấy sự khác biệt?
Valentin Bajrami

Câu trả lời:


34

Nó hiển thị nội dung của biến đặc biệt $@, trong Bash. Nó chứa tất cả các đối số dòng lệnh và lệnh này sẽ lấy tất cả các đối số từ cái thứ hai trở đi và lưu trữ chúng trong một biến , variable.

Thí dụ

Đây là một kịch bản exampe.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Chạy ví dụ:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Tài liệu tham khảo


9
Lưu ý rằng kỹ thuật được hiển thị trộn các đối số đã cho thành một chuỗi. Nếu bạn cần giữ chúng làm đối số riêng biệt, hãy sử dụng một mảng:vars=( "${@:2}" )
glenn jackman

@glennjackman - cảm ơn bạn đã chỉ ra điều đó.
slm

2
Cũng lưu ý việc sử dụng dấu ngoặc nhọn. Bạn phải luôn luôn sử dụng dấu ngoặc nhọn, nhưng Bash cho phép bạn bỏ qua chúng khi bối cảnh không rõ ràng. Do đó, $@${@}giống hệt nhau, mặc dù sau này là cú pháp "chính xác hơn". Bạn phải sử dụng dấu ngoặc với ${@:2}, vì $@:2không rõ ràng và do đó sẽ được hiểu là ${@}:2, điều này không giống nhau.
Paddy Landau

14

Đó là một kshtính năng cũng được tìm thấy trong bashvà các phiên bản gần đây của zsh.

Trong kshbash, bạn có thể truy cập một số phần tử của mảng bằng cách sử dụng ${array[@]:first:length}cú pháp, mở rộng tối đa length(hoặc tất cả nếu lengthbị bỏ qua) các phần tử của arraymảng (trong danh sách các phần tử của mảng được sắp xếp bằng số trên các chỉ mục), bắt đầu bằng cái đầu tiên có chỉ số lớn hơn hoặc bằng first. Khi trong bối cảnh vô hướng (như ở đây trong một bài tập cho một biến vô hướng) danh sách các yếu tố được nối với các nhân vật không gian với bashksh93và với ký tự đầu tiên của $IFS(hoặc không có gì nếu $IFSlà rỗng hoặc không gian nếu nó là unset) với zsh.

Ví dụ:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@là một trường hợp đặc biệt. $@là mảng các tham số vị trí ( $1, $2...). Nhưng khi sử dụng với :, $0cũng được bao gồm. Như vậy ${@:1}là giống như $@, không ${@:0}giống như cho các mảng khác.

Trong zsh, nó hơi khác nhau. zshchỉ thêm kshcú pháp gần đây để tương thích nhưng có cú pháp riêng để chọn phạm vi các phần tử.

Trái ngược với kshbash, zshmảng là một loại biến khác với các biến vô hướng, không thưa thớt ( zshcó mảng kết hợp như một loại biến khác) và bắt đầu ở chỉ số 1 thay vì 0.

Đối với zsh, bạn truy cập các phạm vi phần tử mảng với $a[first,last](nơi lastcũng có thể âm để đếm ngược từ cuối).

Trong zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

tạo ra một mảng với 235 phần tử, hầu hết đều trống. $a[12,50]sẽ mở rộng thành các phần tử 12 đến 50 và ${a[@]:12:2}chỉ mở rộng sang phần tử (trống) $a[12]$a[13]phần tử. Như một trường hợp đặc biệt, và một lần nữa cho tính di động với ksh93bash, zshcũng chấp nhận một 0yếu tố đầu tiên $@và xử lý như vậy $0.

Vì vậy, bạn có thể sử dụng ${a[@]:x:n}và có thể di chuyển ${@:x:n}trên tất cả 3 shell, nhưng chỉ cho các mảng không thưa thớt và chú ý đến giá trị của IFS.

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.