2017-06-21 12 views
0

文字列変数(ここでは配列)を代入しようとしていますが、エラーが発生しています。誰もこれを解決する方法を提案できますか?文字列変数を配列名に置き換えます。

COMP="MY" 

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

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

ERROR:

$ {$ {} COMP _common_sections_to_fix [@]}:あなたが何をしようとして悪い置換

+0


あなたがの場合はevalと牛車が(残念なが)可能な選択肢である、利用可能bashの4.3を持っていませんか? 4.4には便利な組み込み関数が用意されています。 –

+0

あなたが初期化した配列は 'MY_common_sections_to_fix'なので、' L1CC_common_sections_to_fix'にアクセスしようとしています。それは非驚きのレベルです。しかし、変数の動的な命名も問題になります。あなたは 'MY_common_sections_to_fix'を保持する変数を作成し、' $ {!varname [@]} 'やそれをテストする方法を試すことができますが、' $ {!var} 'は' $ var' 。 (Semi-tested:結果は有望なものではありませんが、これ以上の通知がない限り動作しないと仮定しています) –

+0

注意:動作しません - [shell parameter expansion](https://www.gnu.org)を参照してください。 /software/bash/manual/bash.html#Shell-Parameter-Expansion)を参照してください。間接的に配列名を拡張することはできないようです。 –

答えて

2

は、配列を参照する間接的です。あなたは新しい十分シェル(4.3以降)を持っている場合

namerefは、仕事のために最も適切なツールです:

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

これはMY_common_sections_to_fixの別名をactive_sectionsなり、適切.rodata.dataを発します出力として出力する。 bashのバージョンの

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

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

+0

彼らは質問の変数名に "MY"を使用しました。彼らは両方の値を使用しています。これはどちらかが正しいことを意味します。どちらか一方を変更して、実際の例を生成する必要があります。 –

+0

私は彼らが 'L1CC_common_sections_to_fix'にしようと思っていましたが、そうではないかもしれません。 '-n'オプションを取り除くと、最初のコマンドは3.xで動作します。 –

関連する問題