配列に空白がある場合、これは期待どおりに機能しません。
function create_some_array() {
local -a a=()
for i in $(seq $1 $2); do
a[i]="$i $[$i*$i]"
done
echo ${a[@]}
}
さらに悪いことに、外部の "a" から配列インデックスを取得しようとすると、スカラーであることが判明します。
echo ${!a[@]}
配列として代入しても役に立たない可能性があるため、エコー行によって引用が自然に削除され、引用を回避するために評価順序を操作することはできません:
function create_some_array() {
...
echo "${a[@]}"
}
a=($(create_some_array 0 10))
echo ${!a[@]}
それでも、printf も役に立たないようです。
function create_some_array() {
...
printf " \"%s\"" "${a[@]}"
}
一方では正しい出力を生成するようです:
$ create_some_array 0 3; echo
"0 0" "1 1" "2 4" "3 9"
しかし、割り当ては他のものでは機能しません:
$ b=($(create_some_array 0 3))
$ echo ${!b[@]}
0 1 2 3 4 5 6 7
したがって、私の最後のトリックは、次のように割り当てを行うことでした。
$ eval b=("$(create_some_array 0 3)")
$ echo -e "${!b[@]}\n${b[3]}"
0 1 2 3
3 9
タター!
PS: printf "%q " "${a[@]}" も正常に動作します...