文字列値に基づいて配列を呼び出す

文字列値に基づいて配列を呼び出す

次のように、文字列変数で名前が定義されているbashスクリプトから配列を呼び出す必要があります。

var="array"
array=( 
1
2
3
)

$ varは常に配列名と同じです。

#failed attempts at echoing ${array[@]}
echo "${!var}          # returns only the first value of the array

echo "${!var[@]}"      # returns 0

tempvar='${'$var'[@]}' # makes a new variable with value of "${array[@]}"
echo "${!tempvar}"     #returns 'invalid variable name'

私はこの問題に初めて触れ、この問題に対する解決策を見つけることができませんでした。よろしくお願いします。

ベストアンサー1

バッシュ固有

配列を参照するには、「nameref」を使用してください。declare -n

array=(1 2 3)
var=array

declare -n a=$var

for idx in "${!a[@]}"; do echo "$idx -> ${a[idx]}"; done
a[4]="hello"
declare -p a array     # original altered by above assignment

出力

0 -> 1
1 -> 2
2 -> 3
declare -n a="array"
declare -a array=([0]="1" [1]="2" [2]="3" [4]="hello")

何かを作るコピー配列では間接変数を使用してください。見苦しいです。

tmp=${var}[@]          # constructing a string
b=( "${!tmp}" )        # indirect variable expansion
b[4]="goodbye"

declare -p tmp b array     # original not changed

出力

declare -- tmp="array[@]"
declare -a b=([0]="1" [1]="2" [2]="3" [3]="hello" [4]="goodbye")
declare -a array=([0]="1" [1]="2" [2]="3" [4]="hello")

「hello」要素のインデックスがどのように変更されるかを確認してくださいb。これはb=("${!tmp}")、配列の一意のコピーが作成されるためです。要素、いいえ索引

おすすめ記事