bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

a == a[0] convention


From: Dan Douglas
Subject: a == a[0] convention
Date: Thu, 2 Jun 2016 01:16:59 -0500

This is possibly relevant to some of Grisha's observations. First,
declaring or assigning to a variable with a subscript. I think I would
prefer these to be errors for various reasons. Admittedly there's an
argument for making one or both of these non-errors for declarations
without assignment for consistency with the current documentation, and
maybe even allowing the current behavior (no errors ever). I think
that leads to confusion though.

     $ bash -c 'typeset -n ref[0]=foo' # no error
     $ bash -c 'typeset -n ref[1]=foo' # no error

The other variations on this theme are if there are references to
"arrays" with or without a zero subscript. Bash example:

     $ bash -xc '
    typeset -n ref1=a1 ref2=a2 ref3=a3[0] ref4=a4[0]
    ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo
    echo "${ref1} ${ref2[0]} ${ref3} ${ref4[0]}"
    typeset -p {ref,a}{1,2,3,4}'

    + typeset -n ref1=a1 ref2=a2 'ref3=a3[0]' 'ref4=a4[0]'
    + ref1=foo
    + ref2[0]=foo
    + ref3=foo
    + ref4[0]=foo
    + echo 'foo foo foo foo'
    foo foo foo foo
    + typeset -p ref1 ref2 ref3 ref4 a1 a2 a3 a4
    declare -n ref1="a1"
    declare -a ref2=([0]="foo")
    declare -n ref3="a3[0]"
    declare -a ref4=([0]="foo")
    declare -- a1="foo"
    /home/ormaaj/doc/programs/bash-build/bash: line 4: typeset: a2: not found
    declare -a a3=([0]="foo")
    /home/ormaaj/doc/programs/bash-build/bash: line 4: typeset: a4: not found

I think the mksh result for that code is most like what bash is
probably going for. It mostly treats `ref[0]` as `ref` both when
assigning and dereferencing.

     $ mksh -xc '
    typeset -n ref1=a1 ref2=a2 ref3=a3[0] ref4=a4[0]
    ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo
    echo "${ref1} ${ref2[0]} ${ref3} ${ref4[0]}"
    typeset -p {ref,a}{1,2,3,4}'
    + typeset -n 'ref1=a1' 'ref2=a2' 'ref3=a3[0]' 'ref4=a4[0]'
    + ref1=foo ref2[0]=foo ref3=foo ref4[0]=foo
    + echo 'foo foo foo foo'
    foo foo foo foo
    + typeset -p ref1 ref2 ref3 ref4 a1 a2 a3 a4
    typeset -n ref1=a1
    typeset -n ref2=a2
    typeset -n ref3='a3[0]'
    typeset -n ref4='a4[0]'
    typeset a1=foo
    set -A a2
    typeset a2[0]=foo
    set -A a3
    typeset a3[0]=foo
    set -A a4
    typeset a4[0]=foo

ksh93 also does that except ref4 which understandably assigns to a4[0][0].



reply via email to

[Prev in Thread] Current Thread [Next in Thread]