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ì $@:2
không rõ ràng và do đó sẽ được hiểu là ${@}:2
, điều này không giống nhau.
Đó là một ksh
tính năng cũng được tìm thấy trong bash
và các phiên bản gần đây của zsh
.
Trong ksh
và 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 length
bị bỏ qua) các phần tử của array
mả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 bash
và ksh93
và với ký tự đầu tiên của $IFS
(hoặc không có gì nếu $IFS
là 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 :
, $0
cũ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. zsh
chỉ thêm ksh
cú 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 ksh
và bash
, zsh
mả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 ( zsh
có 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 last
cũ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 ksh93
và bash
, zsh
cũng chấp nhận một 0
yế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.