Voinko mitenkään tulostaa muuttujan nimen sen arvon kanssa?
j=jjj k=kkk l=lll for i in j k l do .... done
Odotettu tulos (kukin muuttuja erillisellä rivillä):
j = jjj k = kkk l = lll
Voiko kukaan ehdottaa tapaa saada yllä oleva tulos?
Kommentit
- Liittyvät: unix.stackexchange.com/questions/129084/…
vastaus
Yksinkertaisella tavalla:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Lähtö:
j = jjj k = kkk l = lll
-
${!i}
– bash muuttujan laajennus / indirection (saa arvon$i
hallussa olevan muuttujan nimen arvon)
Kommentit
- Voit tehdä
{j,k,l}
lyhyen myös{j..l}
🙂 - @ αғsнιη, se ' on järkevää laajennetuille alueille, kunhan vain 3 ems –
{j,k,l}
riittää -
j k l
riittää.
Vastaus
Jos sinulla on bash v4.4 tai uudempi, voit käyttää ${VAR@A}
Parametrilaajennusoperaattoria.
Tätä käsitellään Bash-käsikirjan kohdassa 3.5.3 Shell-parametrien laajennus
”A” Operaattori
Laajennus on merkkijono tehtävälausekkeen tai julistaa komennon muodossa, että jos arvioitu, luo parametrin attribuuteineen ja arvollaan uudelleen.
Joten tällä voit tehdä:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Ja tuloksesi tulisi olla:
j="jjj" k="kkk" l="lll"
vastaus
Tai käytä zsh
-kohdassa declare -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 ) %
kommentteja
- toimii myös Bashin kanssa
vastaus
Vaikka ${!i}
on puhtaampi ja nopeampi ratkaisu täydellisyyteen, epäsuora viittauksen saa myös seuraavasta esimerkistä:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Siksi :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
antaa :
j = jjj k = kkk l = lll
Viitteet: