Làm thế nào để in tên biến cùng với giá trị của nó?


10

Có cách nào để tôi có thể in tên biến cùng với giá trị của nó không?

j=jjj
k=kkk
l=lll

for i in j k l
do
    ....
done

Đầu ra dự kiến ​​(mỗi biến trên một dòng riêng biệt):

j = jjj 
k = kkk
l = lll

Có ai có thể đề xuất một cách để có được kết quả trên không?


Câu trả lời:


21

Theo cách đơn giản:

j="jjj"
k="kkk"
l="lll"

for i in {j,k,l}; do echo "$i = ${!i}"; done

Đầu ra:

j = jjj
k = kkk
l = lll

  • ${!i}- bash mở rộng / chỉ định biến (lấy giá trị của tên biến được giữ bởi $i)

2
Bạn cũng có thể rút {j,k,l}ngắn với {j..l}:)
αғsнι

@ αғsнι, thật hợp lý cho các phạm vi mở rộng, miễn là chỉ có 3 mục - {j,k,l}là đủ
RomanPerekhrest

1
j k lsẽ là đủ
Stéphane Chazelas

6

Nếu bạn có bash v4.4 trở lên, bạn có thể sử dụng ${VAR@A}toán tử mở rộng Parameter.

Điều này được thảo luận trong hướng dẫn Bash trong phần 3.5.3 Mở rộng tham số Shell

Toán tử 'A'

Việc mở rộng là một chuỗi dưới dạng một câu lệnh gán hoặc lệnh khai báo, nếu được đánh giá, sẽ tạo lại tham số với các thuộc tính và giá trị của nó.

Vì vậy, với điều này bạn có thể làm:

j="jjj"
k="kkk"
l="lll"

for i in {$j,$k,$l}; do 
    echo "${i@A}"
done

Và kết quả của bạn sẽ là:

j='jjj'
k='kkk'
l='lll'

5

Hoặc đang zshsử dụngdeclare -p

% j=jjj; k=kkk; l=(l l l)               
% for v in j k l; do declare -p $v; done
typeset j=jjj
typeset k=kkk
typeset -a l=( l l l )
% 

3
cũng làm việc với Bash
Steven Penny

2

Trong khi ${!i}là một giải pháp sạch hơn và nhanh hơn, để hoàn thiện, tham chiếu gián tiếp cũng có thể thu được với ví dụ sau:

 foo=bar
 bar=baz
 $ echo $foo
 bar
 $ eval echo \$${foo}
 baz

Vì thế:

 j="jjj"
 k="kkk"
 l="lll"

 for i in {j,k,l}; do
   echo "$i = `eval echo \\$${i}`"
 done

Cung cấp:

 j = jjj
 k = kkk
 l = lll

Người giới thiệu:

Tài liệu tham khảo gián tiếp

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.