2

間接展開によって取得した配列内のすべての値を展開しようとしています:

> my_array=(coconut banana)
> echo "${my_array[@]}" 
coconut banana
> my_array_name=my_array
> echo ${!my_array_name}
coconut
> echo "${!my_array_name[@]}"
0

正しいコマンドの入力方法がわからないため、最後のコマンドで「配列キーのリスト」を誤って使用していますか?

私は取得したい:

coconut banana

おそらく、いくつかの醜いハックに頼ることなくeval.. 1つのサックハックの例:

> echo \${$my_array_name[@]}
${my_array[@]}
> eval echo \${$my_array_name[@]}
coconut banana

ノート

my_arrayスペースを含む値を含めることができます!

編集

私が書いている関数では、my_array_name は "$1" で設定されているため、文字どおりには使用できません。

に似ています: https://unix.stackexchange.com/questions/20171/indirect-return-of-all-elements-in-an-arrayevalしかし、スクリプトが持つ厄介な影響から保護するために使用を避ける必要があります環境はちょうどいいタイミングで「ハッキング」されました...

4

2 に答える 2

4

これはうまくいくはずです

my_array_name='my_array[@]'
echo "${!my_array_name}"

コメントの後:配列の名前と「[@]」を含む文字列を作成する必要があります。別の例

my_array_name="$1"'[@]'
echo "${!my_array_name}"

コメントの後 : 関数でテストする

display_elem() {
  local arrname
  arrname="$1[@]"
  printf "%s\n" "${!arrname}"
}

display_elem my_array
于 2012-10-02T13:33:18.087 に答える
1

問題はmy_array_name=my_array. のすべての値を取得する必要がありますmy_array。代わりにこれを試してください:

 my_array_name=${my_array[@]}
 echo "${my_array_name[@]}"
于 2012-10-02T13:32:30.927 に答える