2017-06-21 50 views
0

我試圖用字符串變量(數組在這裏)替代,但出現錯誤。任何人都可以建議如何解決此問題?將字符串變量替換爲數組名稱

COMP="MY" 

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

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

錯誤:

$ {$ {} COMP _common_sections_to_fix [@]}:壞替代

+0

bash的哪個版本? 4.4中有一個方便的內置函數。 –

+0

由於您初始化的數組是「MY_common_sections_to_fix」,但您試圖訪問「L1CC_common_sections_to_fix」,這是一個不出人意料的級別。但是,變量的動態命名也是有問題的。你可以創建一個變量來保存'MY_common_sections_to_fix',並找出如何利用'$ {!varname [@]}'或其附近 - 未經測試,但是'$ {var}'引用變量的名稱存儲在'$ var'中。 (半測試:結果看起來並不樂觀,假設它不會工作,直到另行通知!) –

+0

進一步注意:它不起作用 - 請參閱[shell參數擴展](https://www.gnu.org /software/bash/manual/bash.html#Shell-Parameter-Expansion)。它看起來像你不能做數組名稱的間接擴展。 –

回答

2

你正在試圖做的是間接引用數組什麼。

一個nameref,如果你有一個足夠新殼(4.3或更高版本),是這項工作的最合適的工具:

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

這使得active_sections一個別名MY_common_sections_to_fix,妥善發出.rodata.data作爲輸出。


如果有bash的4.3可用,兩輪牛車與eval是可用的(雖然是不幸的)選項:

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

...'COMP =「L1CC」'...... –

+0

Eh,他們在問題的變量名稱中使用了「我的」。他們使用這兩個值,這意味着要麼同樣正確 - 需要修改其中一個或另一個來生成一個工作示例。 –

+0

我以爲他們試圖讓它成爲'L1CC_common_sections_to_fix',但也許不是。如果我取出'-n'選項,第一個命令與3.x一起工作。 –