()構文に変数を使用できますか?
#!/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
あらゆる種類の問題が発生する可能性があるため、ユーザー入力に設定されていないことを確認してください。