Er der nogen måde, jeg kan udskrive variabelnavnet sammen med dens værdi?
j=jjj k=kkk l=lll for i in j k l do .... done
Forventet output (hver variabel på en separat linje):
j = jjj k = kkk l = lll
Kan nogen foreslå en måde at få ovenstående resultat på?
Kommentarer
- Relateret: unix.stackexchange.com/questions/129084/…
Svar
På enkel måde:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Outputtet:
j = jjj k = kkk l = lll
-
${!i}
– bash variabel udvidelse / indirektion (får værdien af variabelnavnet i$i
)
Kommentarer
- Du kan gøre
{j,k,l}
kort med{j..l}
også:) - @ αғsнιη, det ' er rimeligt for udvidede intervaller, så længe der kun 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 bruge ${VAR@A}
Parameterudvidelsesoperator.
Dette diskuteres i Bash-manualen under afsnit 3.5.3 Udvidelse af shellparameter
“A” Operator
Udvidelsen er en streng i form af en tildelingserklæring eller erklær kommando, hvis evalueret, vil genskabe parameter med dets attributter og værdi.
Så med dette kan du gøre:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Og dit resultat skal være:
j="jjj" k="kkk" l="lll"
Svar
Eller i zsh
brug 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
- fungerer også med Bash
Svar
Mens ${!i}
er en renere og hurtigere løsning for fuldstændighed, den indirekte reference kan også opnå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
Giver :
j = jjj k = kkk l = lll
Referencer: