連想配列宣言でこの構文が機能しない理由[閉じる]

連想配列宣言でこの構文が機能しない理由[閉じる]

()構文に変数を使用できますか?

#!/bin/bash
declare -A c
declare -A b
a="[a]=0 [b]=1 [c]=2 [d]=3"
b=($a) # or b=($(echo "$a"))
echo "***********${b[@]}*********"  #********************

c=([a]=0 [b]=1 [c]=2 [d]=3)
echo "---------${c[@]}----------"  #---------0 1 2 3----------

答え1

現在(私が知っている限り)Bashから文字列を取得して連想配列を作成することは不可能です。したがって、ステートメントを使用する前にこれを「評価」する必要がありますeval

Bashバージョン4.1.7を使用して例を実行すると、次の結果が表示されます。

$ ./arr.bash 
./arr.bash: line 5: b: [a]=0: must use subscript when assigning associative array
./arr.bash: line 5: b: [b]=1: must use subscript when assigning associative array
./arr.bash: line 5: b: [c]=2: must use subscript when assigning associative array
./arr.bash: line 5: b: [d]=3: must use subscript when assigning associative array

次の行が機能するように変更してください。

eval "b=($a)" # or b=($(echo "$a"))

もう一度実行すると、期待される結果が得られます。

$ ./arr.bash 
***********0 1 2 3*********
---------0 1 2 3----------

説明する

次のタイトルのQ&Aを見つけました。Bash:連想配列を別の変数名(変数の名前変更など)に割り当てる方法は?これはこれを行う1つの方法を説明しますdeclareが、そのメソッドが実際にどれくらい読みにくく使用されていないかを示します。

# declare associative array
declare -A assoc_array=(["key1"]="value1" ["key2"]="value2")
# convert associative array to string
assoc_array_string=$(declare -p assoc_array)
# create new associative array from string
eval "declare -A new_assoc_array="${assoc_array_string#*=}
# show array definition
declare -p new_assoc_array

このメソッドは$assoc_array文字列への変換を表示し、それを連想配列として再表示します$new_assoc_array。ただし、この方法も使用の必要性を避けることはできませんeval。これはわかりにくいコードの一部であり、これを避けるべき理由を示しています。

答え2

あなたはする必要があります

eval "b=($a)"

eval対応するパラメータは、パラメータ拡張後のシェルコマンドによって評価されます。しかし注意して使用してください。$aあらゆる種類の問題が発生する可能性があるため、ユーザー入力に設定されていないことを確認してください。

関連情報