Generieren von Inhalten, die unter einer dynamischen Variable im Shell-Skript gespeichert sind

Generieren von Inhalten, die unter einer dynamischen Variable im Shell-Skript gespeichert sind

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 arraynamein 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:

verwandte Informationen