Ich bin sicher, es ist relativ einfach, ich weiß nur nicht, wie ich es machen soll.
#!/usr/bin/ksh
set `iostat`
myvar=6
Ich möchte so etwas wie das, echo ${$myvar}
was ich als ${$myvar}
-> ${6}
-> interpretieren möchtevalue
shell-script
ksh
variable-substitution
Brandon Kreisel
quelle
quelle
Antworten:
Sie können dies mit
eval
vielen integrierten feinen Shells tun , einschließlich ksh:Der Trick besteht darin, die Zeichenfolge, die Sie
eval
eingeben, in doppelte Anführungszeichen zu setzen, sodass $ myvar durch "6" ersetzt wird, und das äußere Dollarzeichen mit einem Backslash zu versehen, sodass dieeval
Zeichenfolge "$ 6" angezeigt wird .Ich habe "% user" für die Ausgabe erhalten, aber ich habe es auf einem Multiprozessor-RHEL-Computer versucht.
quelle
vv=$( eval "echo \$$vn" )
. Danke vielmals!Indirekte Variablenreferenz
Moderne erweiterte Shells verfügen über eine Methode zum Verweisen auf den Wert einer Variablen, deren Name in einer anderen Variablen gespeichert ist. Leider unterscheidet sich die Methode zwischen ksh, bash und zsh.
In mksh ≥R39b können Sie
myvar
einen nameref machen:Dies funktioniert in ATT ksh93 nicht, da es keine Namensreferenzen für Positionsparameter unterstützt. Wenn Sie eine Variable haben, die einen Variablennamen enthält, können Sie diese Methode verwenden.
In Bash ≥2.0 können Sie schreiben
In zsh können Sie schreiben
In älteren Shells, einschließlich ksh88 und pdksh, können Sie nur dann darauf zurückgreifen, wenn Sie eine Variable mit einem anderen Variablennamen haben und den Wert dieser Variablen verwenden möchten
eval
, wie von Bruce Ediger erläutert . Diese Lösung funktioniert in jeder Bourne / POSIX-Shell.Verwenden eines Arrays
Dies ist die beste Methode hier: Es ist einfacher und portabler.
Für Ihren Anwendungsfall können Sie in jeder Shell mit Arrays (alle ksh-Varianten, bash ≥2.0, zsh) eine Array-Variable zuweisen und das gewünschte Element übernehmen. Beachten Sie, dass ksh- und bash-Arrays mit 0 nummeriert werden, zsh jedoch mit 1, sofern Sie nicht
setopt ksh_arrays
oder ausgebenemulate ksh
.Wenn Sie die Positionsparameter in eine Array-Variable kopieren möchten
a
:In ksh93, mksh ≥R39b, bash ≥2.0 und zsh können Sie die Array-Zuweisungssyntax verwenden:
quelle
eval "vv=\${$vn}"
. Merci Beaucoup, gütiger Herr.Wie Gilles (der den
bash
Teil der Antwort lieferte) anzeigte und Bruce Edigers (wie man es portabel macht) ebenfalls nicht ungültig machteeval
, ist hier beschrieben, wie man esnameref
in den letztenmksh
(und AT & T ksh93, außer - wie @Gilles kommentierte - namerefs macht kann nicht auf Positionsparameter in AT & T verweisen (nur auf benannte Parameter):Das
--
After wurde hinzugefügt, um dieset
Widerstandsfähigkeit zu verbessern.quelle
typeset: 6: invalid variable name
).Eine andere Verwendung von Arrays
Ich habe seit einiger Zeit weder ksh noch eine andere Variante verwendet, daher bin ich mir nicht sicher, ob ksh (oder bash) über eine ähnliche Funktion verfügt. Meine primäre Shell ist zsh. Ich verwende Arrays, wenn ich die Ausgabe von Befehlen wie iostat bearbeite, weil sie mehrere Zeilen erzeugen und nicht alle Zeilen das gleiche Format / die gleiche Länge haben.
Das Obige umgeht auch die Verwendung von Positionsparametern. Wenn Sie nun beispielsweise ein Array von Geräten generieren möchten, gehen Sie wie folgt vor:
Ich finde kleinere Stücke viel einfacher zu handhaben. Abhängig von Ihrem Code müssen Sie möglicherweise eine indirekte Variablenreferenz verwenden oder nicht. Zu wissen, wie es funktioniert, ist immer noch eine gute Sache zu wissen. Ich benutze es selbst.
quelle