Trong bash, làm thế nào tôi có thể lặp lại tên biến, không phải giá trị biến? [đóng cửa]


18

Giả sử rằng tôi có một biến vartrong bash. Tôi có thể gán một giá trị cho nó. Ví dụ, tôi sẽ biến nó thành một chuỗi:

var="Test"

Tôi muốn echotên của var, không phải giá trị nắm giữ var. (Tôi có thể làm cái sau với echo $var, nhưng tôi thực sự muốn làm cái trước.)

Câu trả lời cho câu hỏi này từ SO nói là sử dụng echo ${!var}, nhưng khi tôi làm điều đó, tôi chỉ trả về một dòng trống. Ví dụ: tập lệnh bash này

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"

trả về đầu ra này:

Hi

Bye

chỉ với một dòng trống giữa HiBye , thay vì var . Tôi đang làm gì sai?

Tôi đang chạy bash 4.1.5 (1) trên Ubuntu 10.04.4 .


11
Ơ ... chỉ là echo var?
Braiam

5
Tôi không thực sự hiểu quan điểm của việc này. Như @Braiam chỉ ra, vì bạn đang xác định tên của biến ở vị trí đầu tiên, bạn sẽ luôn biết nó và luôn có thể in nó. Bạn thực sự đang cố gắng làm gì?
terdon

3
Tôi nghĩ rằng bạn đã bỏ lỡ sự trôi dạt của giải pháp SO; thửvar=Test; Test=SO; echo ${!var}
iruvar

Tôi cũng không hiểu nhưng đó là những gì bạn đang cố gắng làm? tiếng vang '$ var'
Renan Vicente

Tôi thực sự tò mò, xin vui lòng cho chúng tôi biết bạn cần điều đó để làm gì!
bubakazouba

Câu trả lời:


22

Việc mở rộng tham số shell $ {! Name @} hoặc $ {! Name *} có thể thực hiện thủ thuật,

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar

Mặc dù khả thi nhưng tôi không thể tưởng tượng được tiện ích của ...


2
Lưu ý rằng nếu fookhông được xác định nhưng foobarlà, bạn sẽ nhận được foobar. Các lựa chọn thay thế khác: var_name=${-+foo}(hoặc ${foo+foo}) var_name=$'foo',, var_name=$"foo":-)
Stéphane Chazelas

1
Nếu có hai biến có thể nhìn thấy, foo và foobar, cả hai được xác định, biểu thức ${!foo@}sẽ ước tính foo foobar. Như câu trả lời nhận xét, tiện ích của nó là khó tưởng tượng.
CppNoob

29

Nếu bạn chỉ muốn xuất ra một tên biến tĩnh, bạn có thể thoát $-sign:

echo \$var

3
Đây phải là giải pháp được chấp nhận.
David Poxon

9
Không phải tất cả!! Câu trả lời này không phải là một giải pháp tốt. Điều này sẽ chỉ đơn giản là đầu ra $var, nhưng sẽ vô dụng nếu tên biến là động. Ví dụ: giả sử bạn cần lọc một tập hợp các biến môi trường bắt đầu bằng a PREFIX_, nhưng bạn không biết về kích thước của tập hợp hoặc tên biến trong đó. Các giải pháp được chấp nhận là phù hợp hơn cho kịch bản này.
Héctor Valverde Pareja

aka var_name = "$ (echo \ $ var)"
Yordan Georgiev
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.