Quando uma variável de matriz representa a matriz inteira e quando o elemento é indexado por '0'?

0

O manual do Bash diz:

Referencing an array variable without a subscript is equivalent to referencing with a subscript of 0.

No shell Bash ou POSIX, existe alguma regra geral para quando uma variável de matriz representa a matriz inteira e quando ela representa o elemento indexado por 0 ?

Por exemplo,

  1. Parece que, após declare , uma variável de matriz significa todo o array, enquanto em expansão de parâmetro, isso significa que o elemento indexado por 0 :

    $ declare -p x
    declare -a x='([1]="b" [2]="c")'
    $ echo $x
    
  2. Em [[ -v myarr ]] , myarr significa a matriz ou myarr[0] ?
por Tim 04.05.2016 / 01:09

2 respostas

3

Acho que sua confusão está na palavra "referência".

Você não está referenciando a variável array após declare ; você está apenas dando o nome x .

Para fazer referência a uma variável, você precisa colocar um $ antes do nome.

Tente pesquisar na página man bash todas as instâncias de referenc e leia-as.

Quanto à segunda pergunta:

In [[ -v myarr ]], does myarr mean the array or myarr[0]?

Por teste, isso significa myarr[0] .

$ declare -p myarr
bash: declare: myarr: not found
$ myarr=()
$ declare -p myarr
declare -a myarr='()'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
$ myarr+=([1]=b)
$ declare -p myarr
declare -a myarr='([1]="b")'
$ echo $myarr

$ [[ -v myarr ]] && echo is set
$ [[ -v myarr[0] ]] && echo is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ myarr+=([0]=q)
$ declare -p myarr
declare -a myarr='([0]="q" [1]="b")'
$ echo $myarr
q
$ [[ -v myarr ]] && echo is set
is set
$ [[ -v myarr[0] ]] && echo is set
is set
$ [[ -v myarr[1] ]] && echo is set
is set
$ 
    
por 04.05.2016 / 01:53
0

Você está misturando variáveis com strings que representam "nomes de variáveis".

Um $variable é a variável, variable é apenas uma string que é interpretada como uma variável por alguns comandos.

Tente isto:

$ a=x
$ x=(111 222 333)
$ declare -p $a
declare -a x='([0]="111" [1]="222" [2]="333")'

A expansão da variável a ( $a ) forneceu a string x , que foi interpretada por declare como "nome da variável" e depois expandida e impressa.

Em [[ -v myarr ]] também o teste está interpretando a string myarr como uma variável, portanto, é sempre a variável inteira.

Tente

$ a=myarr
$ unset myarr
$ [[ -v $a ]] && echo set || echo unset
unset

$ myarr[5]=five
$ [[ -v $a ]] && echo set || echo unset
set
    
por 07.05.2016 / 02:27