Czy istnieje sposób, w jaki mogę wydrukować nazwę zmiennej wraz z jej wartością?
j=jjj k=kkk l=lll for i in j k l do .... done
Oczekiwane dane wyjściowe (każda zmienna w osobnym wierszu):
j = jjj k = kkk l = lll
Czy ktoś może zaproponować sposób uzyskania powyższego wyniku?
Komentarze
- Powiązane: unix.stackexchange.com/questions/129084/…
Odpowiedź
W prosty sposób:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Wyjście:
j = jjj k = kkk l = lll
-
${!i}
– bash interpretacja / pośrednia zmienna (pobiera wartość nazwy zmiennej przechowywanej przez$i
)
Komentarze
-
{j,k,l}
możesz skrócić za pomocą{j..l}
również:) - @ αғsнιη, ' jest rozsądne dla rozszerzonych zakresów, o ile są tylko 3 ems – wystarczyłoby
{j,k,l}
-
j k l
wystarczy.
Odpowiedź
Jeśli masz bash w wersji 4.4 lub nowszej, możesz użyć ${VAR@A}
operatora rozszerzania parametrów.
Jest to omówione w podręczniku Bash w sekcji 3.5.3 Rozszerzenie parametrów powłoki
„A” Operator
Interpretacja jest ciągiem znaków w postaci instrukcji przypisania lub deklaracji polecenia, jeśli ocenione, ponownie utworzy parametr wraz z jego atrybutami i wartością.
Dzięki temu możesz zrobić:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
A Twój wynik powinien wyglądać następująco:
j="jjj" k="kkk" l="lll"
Odpowiedź
Lub w zsh
użyj 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 ) %
Komentarze
- działa też z Bashem
Odpowiedź
Chociaż ${!i}
jest czystszym i szybszym rozwiązaniem, aby zapewnić kompletność, pośredni odniesienie można również uzyskać za pomocą następującego przykładu:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Dlatego :
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
Daje:
j = jjj k = kkk l = lll
Referencje: