我試圖用字符串變量(數組在這裏)替代,但出現錯誤。任何人都可以建議如何解決此問題?將字符串變量替換爲數組名稱
COMP="MY"
MY_common_sections_to_fix=(\
".rodata" \
".data" \
)
echo ${${COMP}_common_sections_to_fix[@]}
錯誤:
$ {$ {} COMP _common_sections_to_fix [@]}:壞替代
我試圖用字符串變量(數組在這裏)替代,但出現錯誤。任何人都可以建議如何解決此問題?將字符串變量替換爲數組名稱
COMP="MY"
MY_common_sections_to_fix=(\
".rodata" \
".data" \
)
echo ${${COMP}_common_sections_to_fix[@]}
錯誤:
$ {$ {} COMP _common_sections_to_fix [@]}:壞替代
你正在試圖做的是間接引用數組什麼。
一個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"
...'COMP =「L1CC」'...... –
Eh,他們在問題的變量名稱中使用了「我的」。他們使用這兩個值,這意味着要麼同樣正確 - 需要修改其中一個或另一個來生成一個工作示例。 –
我以爲他們試圖讓它成爲'L1CC_common_sections_to_fix',但也許不是。如果我取出'-n'選項,第一個命令與3.x一起工作。 –
bash的哪個版本? 4.4中有一個方便的內置函數。 –
由於您初始化的數組是「MY_common_sections_to_fix」,但您試圖訪問「L1CC_common_sections_to_fix」,這是一個不出人意料的級別。但是,變量的動態命名也是有問題的。你可以創建一個變量來保存'MY_common_sections_to_fix',並找出如何利用'$ {!varname [@]}'或其附近 - 未經測試,但是'$ {var}'引用變量的名稱存儲在'$ var'中。 (半測試:結果看起來並不樂觀,假設它不會工作,直到另行通知!) –
進一步注意:它不起作用 - 請參閱[shell參數擴展](https://www.gnu.org /software/bash/manual/bash.html#Shell-Parameter-Expansion)。它看起來像你不能做數組名稱的間接擴展。 –