Hur skriver jag ut variabelnamnet tillsammans med dess värde?

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

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:

Indirekta referenser

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *