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 - <[email protected]> - http://www.f-hauri.ch