Existuje nějaký způsob, jak mohu vytisknout název proměnné spolu s její hodnotou?
j=jjj k=kkk l=lll for i in j k l do .... done
Očekávaný výstup (každá proměnná na samostatném řádku):
j = jjj k = kkk l = lll
Může někdo navrhnout způsob, jak dosáhnout výše uvedeného výsledku?
Komentáře
- Související: unix.stackexchange.com/questions/129084/…
Odpověď
Jednoduchým způsobem:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Výstup:
j = jjj k = kkk l = lll
-
${!i}
– bash proměnná expanze / indirection (získá hodnotu názvu proměnné drženou$i
)
komentáře
- Můžete zkrátit
{j,k,l}
pomocí{j..l}
také :)) - @ αғsнιη, je to ' přiměřené pro rozšířené rozsahy, pokud existují pouze 3 ems – stačí
{j,k,l}
-
j k l
.
Odpověď
Pokud máte bash v4.4 nebo novější, můžete použít ${VAR@A}
operátor rozšíření parametrů.
Toto je popsáno v příručce k bash v sekci 3.5.3 Rozšíření parametrů shellu
„A“ Operátor
Rozšíření je řetězec ve formě příkazu přiřazení nebo deklaruje příkaz, který, pokud vyhodnocen, znovu vytvoří parametr s jeho atributy a hodnotou.
Takže s tímto můžete:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
A váš výsledek by měl být:
j="jjj" k="kkk" l="lll"
Odpověď
Nebo v zsh
použít 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 ) %
Komentáře
- funguje také s Bash
Odpověď
Zatímco ${!i}
je čistší a rychlejší řešení, pro úplnost nepřímý odkaz lze získat také na následujícím příkladu:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Proto:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Gives:
j = jjj k = kkk l = lll
Odkazy: