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
- Gerelateerd: unix.stackexchange.com/questions/129084/…
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: