Kann ich den Variablennamen zusammen mit seinem Wert auf irgendeine Weise drucken?
j=jjj k=kkk l=lll for i in j k l do .... done
Erwartete Ausgabe (jede Variable in einer separaten Zeile):
j = jjj k = kkk l = lll
Kann jemand einen Weg vorschlagen, um das obige Ergebnis zu erhalten?
Kommentare
- Verwandte Themen: unix.stackexchange.com/questions/129084/…
Antwort
Auf einfache Weise:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = ${!i}"; done
Die Ausgabe:
j = jjj k = kkk l = lll
-
${!i}
– bash Variablenexpansion / -indirektion (ruft den Wert des Variablennamens ab, der von$i
gehalten wird)
Kommentare
- Sie können
{j,k,l}
mit{j..l}
auch kurz machen 🙂
{j,k,l}
würde ausreichen j k l
würde ausreichen. Antwort
Wenn Sie bash v4.4 oder höher haben, können Sie ${VAR@A}
Parametererweiterungsoperator verwenden.
Dies wird im Bash-Handbuch unter Abschnitt 3.5.3 Erweiterung der Shell-Parameter
„A“ Operator
Die Erweiterung ist eine Zeichenfolge in Form einer Zuweisungsanweisung oder eines Deklarationsbefehls, der, wenn ausgewertet, erstellt den Parameter mit seinen Attributen und seinem Wert neu.
Damit können Sie Folgendes tun:
j="jjj" k="kkk" l="lll" for i in {$j,$k,$l}; do echo "${i@A}" done
Und Ihr Ergebnis sollte sein:
j="jjj" k="kkk" l="lll"
Antwort
Oder verwenden Sie in zsh
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 ) %
Kommentare
- funktioniert auch mit Bash
Antwort
Während ${!i}
eine sauberere und schnellere Lösung ist, ist der Vollständigkeit halber die indirekte Eine Referenz kann auch anhand des folgenden Beispiels erhalten werden:
foo=bar bar=baz $ echo $foo bar $ eval echo \$${foo} baz
Daher:
j="jjj" k="kkk" l="lll" for i in {j,k,l}; do echo "$i = `eval echo \\$${i}`" done
ives:
j = jjj k = kkk l = lll
Referenzen: