Kuinka muuttujan nimi tulostetaan sen arvon kanssa?

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

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:

Epäsuorat viitteet

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *