Hoe de variabelenaam samen met zijn waarde afdrukken?

Is er een manier om de variabelenaam samen met zijn waarde af te drukken?

j=jjj k=kkk l=lll for i in j k l do .... done 

Verwachte output (elke variabele op een aparte regel):

j = jjj k = kkk l = lll 

Kan iemand een manier voorstellen om het bovenstaande resultaat te krijgen?

Opmerkingen

Antwoord

Op eenvoudige manier:

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

De uitvoer:

j = jjj k = kkk l = lll 

  • ${!i} bash variabele uitbreiding / indirecte (haalt de waarde op van de variabelenaam die wordt vastgehouden door $i)

Opmerkingen

  • Je kunt {j,k,l} kort maken met {j..l} ook:)
  • @ αғsнιη, het ' is redelijk voor uitgebreide bereiken, zolang er maar 3 ems – {j,k,l} zou voldoende zijn
  • j k l zou voldoende zijn.

Answer

Als je bash v4.4 of hoger hebt, kun je ${VAR@A} Parameter-uitbreidingsoperator gebruiken.

Dit wordt besproken in de Bash-handleiding onder sectie 3.5.3 Shell Parameter Expansion

“A” Operator

De uitbreiding is een tekenreeks in de vorm van een toewijzingsinstructie of declareer een commando dat, als geëvalueerd, zal de parameter opnieuw maken met zijn attributen en waarde.

Dus hiermee kunt u doen:

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

En je resultaat zou moeten zijn:

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

Antwoord

Of gebruik in zsh 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 ) % 

Reacties

  • werkt ook met Bash

Antwoord

Hoewel ${!i} een schonere en snellere oplossing is, voor de volledigheid, de indirecte referentie kan ook worden verkregen met het volgende voorbeeld:

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

Daarom:

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

Geeft:

 j = jjj k = kkk l = lll 

Referenties:

Indirecte referenties

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *