Bagaimana cara mencetak nama variabel beserta nilainya?

10

Apakah ada cara saya bisa mencetak nama variabel beserta nilainya?

j=jjj
k=kkk
l=lll

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

Output yang diharapkan (setiap variabel pada baris terpisah):

j = jjj 
k = kkk
l = lll

Adakah yang bisa menyarankan cara untuk mendapatkan hasil di atas?

ejuser
sumber

Jawaban:

21

Secara sederhana:

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

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

Hasil:

j = jjj
k = kkk
l = lll

  • ${!i}- ekspansi variabel bash / tipuan (mendapat nilai dari nama variabel yang dipegang oleh $i)
RomanPerekhrest
sumber
2
Anda dapat membuat {j,k,l}singkat dengan {j..l}juga
:)
@ αғsнιη, masuk akal untuk rentang yang diperluas, selama hanya ada 3 item - {j,k,l}cukup
RomanPerekhrest
1
j k lakan cukup.
Stéphane Chazelas
6

Jika Anda memiliki bash v4.4 atau yang lebih baru, Anda dapat menggunakan ${VAR@A}operator ekspansi Parameter.

Ini dibahas dalam manual Bash di bagian 3.5.3. Ekspansi Parameter Shell

Operator 'A'

Ekspansi adalah string dalam bentuk pernyataan penugasan atau menyatakan perintah yang, jika dievaluasi, akan menciptakan kembali parameter dengan atribut dan nilainya.

Maka dengan ini yang bisa Anda lakukan:

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

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

Dan hasil Anda seharusnya:

j='jjj'
k='kkk'
l='lll'
jesse_b
sumber
5

Atau sedang zshdigunakandeclare -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 )
% 
thrig
sumber
3
bekerja dengan Bash juga
Steven Penny
2

Sementara ${!i}solusi yang lebih bersih dan lebih cepat, untuk kelengkapan, referensi tidak langsung juga dapat diperoleh dengan contoh berikut:

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

Karena itu:

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

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

Memberi:

 j = jjj
 k = kkk
 l = lll

Referensi:

Referensi Tidak Langsung

geedoubleya
sumber