Hello, All this could be done by using `mapfile`!
Consider this little `dumpArray` function: $ dumpArray() { local _fmt_str; local -n _array=$1 printf -v _fmt_str ' [%q]=%%s\n' ${!_array[@]} printf "$_fmt_str" "${_array[@]@Q}" } $ dumpArray BASH_VERSINFO [0]='5' [1]='2' [2]='15' [3]='1' [4]='release' [5]='x86_64-pc-linux-gnu' Le Thu, Jul 31, 2025 at 04:47:00PM +0300, Toni Kauppi a écrit : > .|declare -a T=(); > .|printf -v 'T[@]' '%s %s %s' {a..c}{0..2}; > .|printf '%s\n' "${T[@]}"; > -|a0 a1 a2 > -|b0 b1 b2 > -|c0 c1 c2 $ printf -v tmpStr '%s %s %s\n' {a..c}{0..2} $ mapfile -t T <<<"${tmpStr%$'\n'}" $ dumpArray T [0]='a0 a1 a2' [1]='b0 b1 b2' [2]='c0 c1 c2' > .|printf -v 'T[@]:1' '%s %s %s' {d..f}{0..2}; > .|printf '%s\n' "${T[@]}"; > -|a0 a1 a2 > -|d0 d1 d2 > -|e0 e1 e2 > -|f0 f1 f2 $ printf -v tmpStr '%s %s %s\n' {d..f}{0..2} $ mapfile -O 1 -t T <<<"${tmpStr%$'\n'}" $ dumpArray T [0]='a0 a1 a2' [1]='d0 d1 d2' [2]='e0 e1 e2' [3]='f0 f1 f2' > .|printf -v 'T[@]:2:1' '%s %s %s' {g..i}{0..2}; > .|printf '%s\n' "${T[@]}"; > -|a0 a1 a2 > -|d0 d1 d2 > -|g0 g1 g2 > -|f0 f1 f2 $ printf -v tmpStr '%s %s %s\n' {g..i}{0..2} $ mapfile -O 2 -n 1 -t T <<<"${tmpStr%$'\n'}" $ dumpArray T [0]='a0 a1 a2' [1]='d0 d1 d2' [2]='g0 g1 g2' [3]='f0 f1 f2' > .|printf -v 'T[@]:-1:2' '%s %s %s' {a..c}{0..2}; > .|printf '%s\n' "${T[@]}"; > -|a0 a1 a2 > -|d0 d1 d2 > -|g0 g1 g2 > -|a0 a1 a2 > -|b0 b1 b2 $ printf -v tmpStr '%s %s %s\n' {a..b}{0..2} $ mapfile -O $((${#T[@]}-1)) -t T <<<"${tmpStr%$'\n'}" $ dumpArray T [0]='a0 a1 a2' [1]='d0 d1 d2' [2]='g0 g1 g2' [3]='a0 a1 a2' [4]='b0 b1 b2' > Similar effect in part can be had with this code: > > declare -i L=; > while read A B C; > do T[L++]="$A $B $C"; > done < <( > printf '%s %s %s\n' {a..c}{0..2}); ( From a while, I tend to avoid bash loops ;-) -- Félix Hauri - <fe...@f-hauri.ch> - http://www.f-hauri.ch