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
var="my_value"; echo var="${var[@]:2}"; echo "$var"Thấy sự khác biệt?
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
var="my_value"; echo var="${var[@]:2}"; echo "$var"Thấy sự khác biệt?
Câu trả lời:
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.
Đâ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
vars=( "${@:2}" )
$@và ${@}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.
Đó 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 kshvà bash, 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 bashvà ksh93và 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 kshvà bash, 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]và $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 ksh93và bash, 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.