Come stampare il nome della variabile insieme al suo valore?

Esiste un modo per stampare il nome della variabile insieme al suo valore?

j=jjj k=kkk l=lll for i in j k l do .... done 

Output previsto (ciascuna variabile su una riga separata):

j = jjj k = kkk l = lll 

Qualcuno può suggerire un modo per ottenere il risultato di cui sopra?

Commenti

Risposta

In modo semplice:

j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done 

Loutput:

j = jjj k = kkk l = lll 

  • ${!i} bash espansione / riferimento indiretto della variabile (ottiene il valore del nome della variabile contenuto in $i)

Commenti

  • Puoi abbreviare {j,k,l} anche con {j..l}🙂
  • @ αғsнιη, ' è ragionevole per intervalli estesi, purché ce ne siano solo 3 ems – {j,k,l} sarebbe sufficiente
  • j k l sarebbe sufficiente.

Risposta

Se hai bash v4.4 o successiva puoi utilizzare ${VAR@A} Operatore di espansione dei parametri.

Questo è discusso nel manuale di Bash nella sezione 3.5.3 Espansione dei parametri della shell

“A” Operator

Lespansione è una stringa sotto forma di unistruzione di assegnazione o di un comando di dichiarazione che, se valutato, ricreerà il parametro con i suoi attributi e il valore.

Quindi con questo puoi fare:

j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done 

E il risultato dovrebbe essere:

j="jjj" k="kkk" l="lll" 

Risposta

Oppure in zsh utilizza 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 ) % 

Commenti

  • funziona anche con Bash

Risposta

Mentre ${!i} è una soluzione più pulita e veloce, per completezza, lindiretta il riferimento può essere ottenuto anche con il seguente esempio:

 foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz 

Therefore:

 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 

Riferimenti:

Riferimenti indiretti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *