Există vreo modalitate prin care pot imprima numele variabilei împreună cu valoarea acesteia?
j=jjj k=kkk l=lll for i in j k l do .... done
Ieșire preconizată (fiecare variabilă pe o linie separată):
j = jjj k = kkk l = lll
Poate cineva să sugereze o modalitate de a obține rezultatul de mai sus?
Comentarii
- Corelat: unix.stackexchange.com/questions/129084/…
Răspuns
În mod simplu:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Rezultatul:
j = jjj k = kkk l = lll
-
${!i}
– bash extensia / indirectarea variabilei (obține valoarea numelui variabilei deținut de$i
)
Comentarii
- Puteți face
{j,k,l}
scurt cu{j..l}
și:) - @ αғsнιη, este ' rezonabil pentru intervale extinse, atâta timp cât există doar 3 ems –
{j,k,l}
ar fi suficient -
j k l
ar fi suficient.
Răspuns
Dacă aveți bash v4.4 sau o versiune ulterioară, puteți utiliza ${VAR@A}
Operator de extindere a parametrilor.
Acest lucru este discutat în manualul Bash în secțiunea 3.5.3 Shell Parameter Expansion
„Un” Operator
Extinderea este un șir sub forma unei instrucțiuni de atribuire sau declară comanda care, dacă evaluat, va recrea parametrul cu atributele și valoarea sa.
Deci, cu aceasta puteți face:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Iar rezultatul dvs. ar trebui să fie:
j="jjj" k="kkk" l="lll"
Răspuns
Sau în zsh
folosiți 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 ) %
Comentarii
- funcționează și cu Bash
Răspuns
În timp ce ${!i}
este o soluție mai curată și mai rapidă, pentru completitudine, indirectul referința poate fi obținută și cu următorul exemplu:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Prin urmare :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Dă :
j = jjj k = kkk l = lll
Referințe: