Một con trỏ (đến một vị trí của bộ nhớ ) không thực sự là một khái niệm hữu ích ở bất kỳ mức nào cao hơn C, có thể là một cái gì đó giống như Python hoặc shell. Các tham chiếu đến các đối tượng tất nhiên là hữu ích trong các ngôn ngữ cấp cao, thậm chí có thể cần thiết để xây dựng các cấu trúc dữ liệu phức tạp. Nhưng trong hầu hết các trường hợp, suy nghĩ về các địa chỉ bộ nhớ là mức quá thấp sẽ rất hữu ích.
Trong Bash (và các shell khác), bạn có thể nhận các giá trị của các phần tử mảng với ${array[index]}
ký hiệu, gán chúng với array[index]=...
và lấy số phần tử trong mảng với ${#array[@]}
. Biểu thức bên trong ngoặc là biểu thức số học. Để làm ví dụ, chúng ta có thể thêm tiền tố không đổi cho tất cả các thành viên mảng:
for ((i=0 ; i < ${#array[@]} ; i++ )) ; do
array[i]="foo-${array[i]}"
done
(Nếu chúng ta chỉ quan tâm đến các giá trị, và không phải các chỉ mục, for x in "${array[@]}" ; do...
sẽ ổn thôi.)
Với các mảng kết hợp hoặc thưa thớt , một vòng số không có ý nghĩa gì nhiều, nhưng thay vào đó chúng ta cần tìm nạp các khóa / chỉ mục mảng bằng ${!array[@]}
. Ví dụ
declare -A assoc=([foo]="123" [bar]="456")
for i in "${!assoc[@]}" ; do
echo "${assoc[$i]}"
done
Thêm vào đó, Bash có hai cách để gián tiếp trỏ đến một biến khác:
- mở rộng gián tiếp , sử dụng các
${!var}
cú pháp , trong đó sử dụng các giá trị của biến có tên là trong var
, và
- namerefs , cần được tạo bằng
declare
nội trang (hoặc ksh
từ đồng nghĩa tương thích, typeset
). declare -n ref=var
làm ref
một tham chiếu đến biến var
.
Namerefs cũng hỗ trợ lập chỉ mục, trong đó nếu chúng ta có arr=(a b c); declare -n ref=arr;
thì ${ref[1]}
sẽ mở rộng sang b
. Việc sử dụng ${!p[1]}
thay vào đó sẽ p
là một mảng và tham chiếu đến biến được đặt tên bởi phần tử thứ hai của nó.
Trong Bash, namerefs theo nghĩa đen là, tham chiếu theo tên và sử dụng một nameref từ bên trong một hàm sẽ sử dụng giá trị cục bộ của biến được đặt tên. Điều này sẽ in local value of var
.
#!/bin/bash
fun() {
local var="local value of var"
echo "$ref";
}
var="global var"
declare -n ref=var
fun
BashFAQ cũng có một bài viết dài hơn về sự gián tiếp .