Pertanyaan Menggunakan variabel sebagai bagian dari nama variabel dalam unix [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya ingin memberi nama variabel sebagai a_${v}.

misalnya: v bisa 2013 2014

Saya sekarang mendeklarasikan variabel ke a_${v}

a_${v}=hI # a_2013 should be Hi

v=2014

begitu a_${v}=Hello # a_2014 seharusnya Halo

Saya mencoba menggunakan perintah eval meskipun tidak membuang kesalahan saat memberikan nilai tetapi saya tidak dapat mengekstrak nilai nama variabel

$ v=2013

$ eval a_${v}=Hi


$ v=2014

$ eval a_${v}=Hello

echo ${a_${v}}

tidak bekerja.. :(

Saya menggunakan bash dan saya tidak ingin mengubah nama variabel yang saya tidak ingin menetapkan nilai ke nilai lain


5
2017-09-07 09:26


asal


Jawaban:


Ekspansi parameter tidak rekursif, oleh karena itu teks ${a_${v}} benar-benar The contents of the variable whose name is 'a_${v}', dan cangkang mengeluhkan bahwa nama variabel ini tidak valid.

Anda dapat mencapai ekspansi rekursif dengan eval perintah, seperti pada

eval printf '%s\n' "\${a_${v}}"

Untuk meningkatkan keterbacaan dan pemeliharaan skrip shell Anda, Anda harus membatasi penggunaan konstruksi seperti itu dan membungkusnya dalam struktur yang sesuai. Lihat rc.subr diberikan pada sistem FreeBSD sebagai contoh.


1
2017-09-07 09:56



Dalam bash Anda dapat melakukannya di bawah ini (perhatikan sintaks tanda seru di baris terakhir):

#!/bin/bash

a_2014='hello 2014'
year=2014
varname=a_${year}
echo ${!varname}

1
2017-09-07 09:54



Dalam bash 4.3 juga:

txt="Value of the variable"

show() { echo "indirect access to $1: ${!1}"; }

a_2014='value of a_2014'
echo "$txt \$a_2014: $a_2014"
show a_2014                    # <-------- this -----------------------+
                               #                                       |
prefix=a                       #                                       |
year=2014                      #                                       |
string="${prefix}_${year}"     #                                       |
echo "\$string: $string"       #                                       |
show "$string"            #$string contains a_2014 e.g. the same as ---+

echo ===4.3====
#declare -n  - only in bash 4.3
#declare -n refvar=${prefix}_${year}
#or
declare -n refvar=${string}

echo "$txt \$refvar: $refvar"
show refvar

echo "==assign to refvar=="
refvar="another hello 2014"
echo "$txt \$refvar: $refvar"
echo "$txt \$a_2014: $a_2014"
show a_2014
show "$string" #same as above
show refvar

cetakan

Value of the variable $a_2014: value of a_2014
indirect access to a_2014: value of a_2014
$string: a_2014
indirect access to a_2014: value of a_2014
===4.3====
Value of the variable $refvar: value of a_2014
indirect access to refvar: value of a_2014
==assign to refvar==
Value of the variable $refvar: another hello 2014
Value of the variable $a_2014: another hello 2014
indirect access to a_2014: another hello 2014
indirect access to a_2014: another hello 2014
indirect access to refvar: another hello 2014

0
2017-09-07 11:54