2012-04-25 29 views
8

Tôi đang gãi đầu vào cái này, không thể tìm thấy tham chiếu bash nói về nó.

Trong đoạn mã dưới đây

host_color=${uphost}_host_color 
host_color=${!host_color} 

được dòng thứ hai làm gì vậy? toán tử! làm gì trong trường hợp này?

Trả lời

6

Đó là một dạng ngắn cho indirect references.

$ foo=bar 
$ bar=bas 
$ echo ${!foo} 
bas 

Việc xây dựng dường như tương tự ${!foo*} mở rộng để tên của tất cả các biến có tên bắt đầu với foo:

$ foo1=x 
$ foo2=y 
$ echo ${!foo*} 
foo1 foo2 
+0

Bạn đã hiểu, cảm ơn bạn. Bây giờ nó có ý nghĩa hoàn toàn, host_color = green, green là một biến khác với mã màu. –

+0

+1 Có vẻ như mã của Oliver đang hoạt động - về cơ bản thiết lập 'host_color' thành giá trị' $ {uphost} _host_color'. Không khác gì khi đặt nó thành '$ {$ {uphost} _host_color}', đúng không? –

1

Từ b ash manual: (!)

Nếu ký tự đầu tiên của tham số là một dấu chấm than, mức gián tiếp biến được giới thiệu. Bash sử dụng giá trị của biến được hình thành từ phần còn lại của tham số là tên của biến số ; biến này sau đó được mở rộng và giá trị đó được sử dụng trong phần còn lại của sự thay thế, thay vì giá trị của tham số. Điều này được gọi là mở rộng gián tiếp. Các trường hợp ngoại lệ đối với trường hợp này là các mở rộng là $ {! Prefix *} và $ {! Name [@]} được mô tả bên dưới.

+1

là $ giống như $ {prefix *!} {Prefix!}? –

+0

Tôi nghĩ rằng đó sẽ là mục nhập tiếp theo trong manpage vì bài đăng của @ Oliver không có "*" hoặc "@": '$ {! Name [@]}' - "Nếu ** name ** là một mảng biến, mở rộng đến danh sách các chỉ mục mảng (khóa) được gán theo tên. Nếu ** name ** không phải là một mảng, mở rộng thành 0 nếu ** name ** được đặt. " –

+0

@Olivier: không, chúng không giống nhau. Tôi đã thêm các bit liên quan từ hướng dẫn bash. –

Các vấn đề liên quan