2017-06-21 1 views
0

Ich versuche, eine String-Variable (ein Array hier) zu ersetzen, aber ich bekomme einen Fehler. Könnte jemand vorschlagen, wie man das löst?Ersetzen Sie eine String-Variable in den Namen eines Arrays

COMP="MY" 

MY_common_sections_to_fix=(\ 
     ".rodata" \ 
     ".data" \ 
    ) 

echo ${${COMP}_common_sections_to_fix[@]} 

ERROR:

$ {$ {COMP} _common_sections_to_fix [@]}: bad Substitution

+0

Welche Version von bash? Es gibt einen praktischen Einbau in 4.4. –

+0

Da das Array, das Sie initialisiert haben, 'MY_common_sections_to_fix' ist, Sie aber versuchen,' L1CC_common_sections_to_fix' zu erreichen, ist das eine Stufe der Überraschung. Problematisch ist jedoch auch die dynamische Benennung von Variablen. Sie könnten eine Variable erstellen, die 'MY_common_sections_to_fix' enthält und herausfinden, wie man' $ {! Varname [@]} 'oder so etwas ausnutzt - ungetestet, aber' $ {! Var} 'verweist auf die Variable mit dem in' $ var' gespeicherten Namen . (Semi-tested: die Ergebnisse sehen nicht vielversprechend aus. Angenommen, dass es bis auf weiteres nicht funktioniert!) –

+0

Weitere Anmerkung: es wird nicht funktionieren - siehe [Shell-Parameter-Erweiterung] (https://www.gnu.org /software/bash/manual/bash.html#Shell-Parameter-Expansion) im Bash-Handbuch. Offenbar können Sie Array-Namen nicht indirekt erweitern. –

Antwort

2

Was Sie indirekt zu tun versuchen ist ein Array verweisen.

A nameref, wenn Sie eine neue genug Schale (4.3 oder höher), ist das am besten geeignete Werkzeug für den Job:

COMP=MY 
MY_common_sections_to_fix=(.rodata .data) 
declare -n active_sections=${COMP}_common_sections_to_fix 
printf '%s\n' "${active_sections[@]}" 

Dies macht active_sections ein Alias ​​für MY_common_sections_to_fix und gibt richtig .rodata und .data als Ausgabe.


Wenn Sie do nicht bash 4.3 zur Verfügung haben, hackery mit eval ist verfügbar (wenn auch bedauerlich) Option:

printf -v cmd '%q=("${%q[@]}")' active_sections "${COMP}_common_sections_to_fix" 
eval "$cmd" 
+0

... 'COMP =" L1CC "' ... –

+0

Sie benutzten "MY" im Variablennamen in der Frage. Sie verwenden beide Werte, dh beide sind gleichermaßen korrekt - der eine oder andere muss modifiziert werden, um ein funktionierendes Beispiel zu generieren. –

+0

Ich dachte, sie versuchten es zu 'L1CC_common_sections_to_fix' zu machen, aber vielleicht auch nicht. Der erste Befehl funktioniert mit 3.x, wenn ich die Option '-n' herausnehme. –

Verwandte Themen