Finns det något sätt att skriva ut variabelnamnet tillsammans med dess värde?
j=jjj k=kkk l=lll for i in j k l do .... done
Förväntad utgång (varje variabel på en separat rad):
j = jjj k = kkk l = lll
Kan någon föreslå ett sätt att få ovanstående resultat?
Kommentarer
- Relaterat: unix.stackexchange.com/questions/129084/…
Svar
På enkelt sätt:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Utgången:
j = jjj k = kkk l = lll
-
${!i}
– bash variabel expansion / indirektion (får värdet på variabelnamnet som innehas av$i
)
Kommentarer
- Du kan göra
{j,k,l}
kort med{j..l}
också:) - @ αғsнιη, det ' är rimligt för utökade intervall, så länge det bara finns 3 det ems –
{j,k,l}
skulle vara tillräckligt -
j k l
skulle vara tillräckligt.
Svar
Om du har bash v4.4 eller senare kan du använda ${VAR@A}
Parameterutvidgningsoperatör.
Detta diskuteras i Bash-manualen under avsnitt 3.5.3 Skalparameterutvidgning
”A” Operatör
Expansionen är en sträng i form av ett tilldelningsuttalande eller förklarar kommando att, om utvärderas, kommer att återskapa parameter med dess attribut och värde.
Så med detta kan du göra:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Och ditt resultat ska vara:
j="jjj" k="kkk" l="lll"
Svar
Eller i zsh
använd 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
- fungerar också med Bash
Svar
Medan ${!i}
är en renare och snabbare lösning, för fullständighet, den indirekta referens kan också erhållas med följande exempel:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Därför :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Ger :
j = jjj k = kkk l = lll
Referenser: