次のように、文字列変数で名前が定義されている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}")
、配列の一意のコピーが作成されるためです。要素、いいえ索引。