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
- Correlati: unix.stackexchange.com/questions/129084/…
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: