Ich komme mit dem folgenden Code nicht weiter und wäre für jede Hilfe sehr dankbar:
Ich versuche, Inhalte innerhalb einer dynamisch generierten Variable einer anderen Variable zuzuweisen. Aber anstatt den Wert der Variable zuzuweisen, sehe ich, dass der Variablenname zugewiesen wird. Ich habe es versucht (echo/eval/!), aber nichts funktioniert. Kann mir bitte jemand bei der Lösung helfen?
Ziel: Zuweisung des Wertes 24 (gespeichert unter Variablemsd_ext_len) Zuendgültige AnzahlVariable.
Variable Aussage
iter_val=1
var_1="msd_ext"
msd_ext_len=24
Code:
eval "final_count"=\${var_${iter_val}}_len
Ausgabe -->msd_ext_len
Erwartete Ausgabe -->24
Wenn ich dem obigen Code eine weitere Codezeile wie unten gezeigt hinzufüge, erhalte ich die Ausgabe:
count_val=${!final_count}
Aber können diese beiden Codezeilen zu einer einzigen Codezeile zusammengefasst werden?
Antwort1
Also, erstens, jedes Mal, wenn Sie etwas wie tun ${var_${iter_val}}
, also versuchen, eine Zahl an einen Variablennamen anzuhängen, sollten Sie stattdessen ein Array verwenden:
arr=(a b c)
arr[1]=x
i=1
echo "${arr[i]}"
Wenn Sie etwas indexieren lassen möchten vonSaitenVerwenden Sie stattdessen ein assoziatives Array ( declare -A arrayname
in Bash).
Die Kombination dieser beiden, beispielsweise das Vorhandensein unterschiedlicher Eigenschaften für einige „Objekte“ in einem Array, ist schwieriger. Sie könnten zwei separate Arrays verwenden und dann foo[i]
und verwenden bar[i]
.
Wenn Sie weiterhin indirekt über den Namen auf diese Arrays verweisen müssen, benötigen Sie eine Namensreferenz.
foo=(a b c)
bar=(x y z)
declare -n arrname=foo
echo "${arrname[i]}"
Ich kann Ihrem Code nicht genau entnehmen, wie Ihre Datenstruktur aussehen soll, deshalb ist es schwierig, nur für dieses Szenario eine Antwort zu geben.
Wenn Sie versuchen, Ihr Beispiel umzuschreiben, könnten Sie etwa Folgendes erreichen:
varnames=()
varnames[1]=msd_ext
varnum=1
msd_ext_len=24
declare -n srcvar="${varnames[varnum]}_len"
declare -n dstvar=final_count
dstvar=$srcvar
echo $final_count
Dafür ist immer noch die Verwendung eines Arrays erforderlich varnames
, da die verschachtelte Erweiterung ${var_$foo}
nicht wirklich funktioniert.
Sehen:
- Bietet Bash Unterstützung für die Verwendung von Zeigern?
- die Seite Arrays auf BashGuide(assoziative Arrays unten)