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

  • Improvement fo... Toni Kauppi
    • Re: Impro... Félix Hauri via Bug reports for the GNU Bourne Again SHell
      • Re: I... Félix Hauri via Bug reports for the GNU Bourne Again SHell

Reply via email to