printf %s\\n "${arr[@]:1:5}"

On Tue, Jun 11, 2024, 12:49 PM Zachary Santer <zsan...@gmail.com> wrote:

> Was "bash tries to parse comsub in quoted PE pattern"
>
> On Wed, Oct 18, 2023 at 8:19 AM Zachary Santer <zsan...@gmail.com> wrote:
> >
> > In Bash 5.2:
> > $ array=( zero one two three four five six )
> > $ printf '%s\n' "${array["{2..6..2}"]}"
> > two
> > four
> > six
> > $ printf '%s\n' "${array[{2..6..2}]}"
> > -bash: {2..6..2}: syntax error: operand expected (error token is
> "{2..6..2}")
> > $ printf '%s\n' "${array["2 4 6"]}"
> > -bash: 2 4 6: syntax error in expression (error token is "4 6")
> > $ printf '%s\n' "${array[2 4 6]}"
> > -bash: 2 4 6: syntax error in expression (error token is "4 6")
> > $ printf '%s\n' "${array[2,4,6]}"
> > six
> > $ indices=(2 4 6)
> > $ printf '%s\n' "${array[${indices[@]}]}"
> > -bash: 2 4 6: syntax error in expression (error token is "4 6")
> > $ printf '%s\n' "${array[${indices[*]}]}"
> > -bash: 2 4 6: syntax error in expression (error token is "4 6")
>
> My mind returns to this nonsense, as I find a use for it.
>
> Imagine this functionality:
> $ array=( zero one two three four five six )
> $ printf '%s\n' "${array[@]( 1 5 )}"
> one
> five
> $ printf '%s\n' "${array[*]( 1 5 )}"
> one five
> $ indices_array=( 6 2 )
> $ printf '%s\n' "${array[@]( "${indices_array[@]}" )}"
> six
> two
> $ indices_scalar='-7 -4'
> $ printf '%s\n' "${array[@]( ${indices_scalar} )}"
> zero
> three
> $ scalar='0123456'
> $ printf '%s\n' "${scalar( 1 5 )}"
> 15
> $ printf  '%s\n' "${scalar( "${indices_array[@]}" )}"
> 62
> $ printf '%s\n' "${scalar( ${indices_scalar} )}"
> 03
>
> The (  ) within the parameter expansion would be roughly analogous to
> the right hand side of a compound assignment statement for an indexed
> array. The values found therein would be taken as the indices of array
> elements or characters to expand. Trying to set indices for the
> indices, i.e. "${array[@]( [10]=1 [20]=5 )}", wouldn't make any sense,
> though, so not quite the same construct.
>
> This could be useful with associative arrays as well, unlike
> "${assoc[@]:offset:length}".
>
> I've repeatedly found myself in situations where I had to construct a
> whole new array out of not-necessarily-contiguous elements of another
> array, just to be able to expand that array somewhere. It would've
> been nicer to just use a set of indices directly. I'm now in a
> situation where I already have the set of indices and I have to loop
> over them to construct the array I need.
>
> I present this as also applying to characters within a scalar
> variable, just to be consistent with ${var:offset:length}, which
> applies to both scalars and arrays. Maybe that could be useful. I
> don't know.
>
> Does this functionality seem valuable to others?
>
> Sorry for being such an ideas guy.
>
> Zack
>
>

Reply via email to