Er det noen måte jeg kan skrive ut variabelnavnet sammen med verdien?
j=jjj k=kkk l=lll for i in j k l do .... done
Forventet utgang (hver variabel på en egen linje):
j = jjj k = kkk l = lll
Kan noen foreslå en måte å få ovennevnte resultat på?
Kommentarer
- Relatert: unix.stackexchange.com/questions/129084/…
Svar
På enkel måte:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Utgangen:
j = jjj k = kkk l = lll
-
${!i}
– bash variabel utvidelse / indireksjon (får verdien av variabelnavnet som holdes av$i
)
Kommentarer
- Du kan gjøre
{j,k,l}
kort med{j..l}
også:) - @ αғsнιη, det ' er rimelig for utvidede områder, så lenge det bare er 3 det ems –
{j,k,l}
ville være nok -
j k l
ville være nok.
Svar
Hvis du har bash v4.4 eller nyere, kan du bruke ${VAR@A}
Parameterutvidelsesoperator.
Dette er diskutert i Bash-manualen under avsnitt 3.5.3 Skalparameterutvidelse
«A» Operator
Utvidelsen er en streng i form av en oppdragserklæring eller erklærer kommando om at hvis evaluert, vil gjenskape parameter med dets attributter og verdi.
Så med dette kan du gjøre:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Og resultatet ditt skal være:
j="jjj" k="kkk" l="lll"
Svar
Eller bruk 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 ) %
Kommentarer i zsh
h3>
- fungerer også med Bash
Svar
Mens ${!i}
er en renere og raskere løsning, for fullstendighet, den indirekte referanse kan også fås med følgende eksempel:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Derfor :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Gir :
j = jjj k = kkk l = lll
Referanser: