Pergunta básica sobre o array Bash

3
#!/bin/bash
# query1.sh

numbers=(53 8 12 9 784 69)
echo ${numbers[3]} # <--- this echoes "9" to standard output.

number=numbers[3]
echo number # <--- this echoes "number" to stdout.
echo $number # <--- this echoes "numbers[3]" to stdout.
echo ... <--- ???

Qual sintaxe devo usar para fazer eco da variável chamada number e obter "9" como saída padrão?

    
por Anthony Webber 18.09.2017 / 15:59

3 respostas

3

É aqui que você deseja indireto de variáveis usando o operador ${!var} :

bash-4.4$ numbers=(53 8 12 9 784 69)
bash-4.4$ number=numbers[3]
bash-4.4$ echo "${!number}"
9

O zsh equivalente seria:

numbers=(53 8 12 9 784 69)
number=numbers[4]
echo ${(P)number}

( zsh arrays indices começam em 1 como na maioria dos outros shells e ferramentas shell, então você pode usar numbers[4] para obter o 4º número).

Se você quisesse atribuir o valor do 4º elemento da matriz a $number , você executaria number=$numbers[4] em zsh ou number=${numbers[3]} em ksh (e bash que acabou de copiar ksh arrays).

    
por 18.09.2017 / 17:08
6

Seu problema é que isso:

number=numbers[3]

Não atribui o quarto elemento da matriz numbers à variável number . Isso porque numbers[3] na verdade não significa nada:

$ numbers=(53 8 12 9 784 69)
$ echo $numbers[3]
53[3]

O que acontece é que quando você usa o nome do array sozinho como uma variável, o que realmente está sendo usado é o primeiro elemento do array ( 53 ). Então, $numbers[3] se torna 53[3] . O que você quer é:

$ number=${numbers[3]}
$ echo $number
9
    
por 18.09.2017 / 16:27
0

Quando você declara uma variável, não precisa usar o $ , mas quando usá-lo, você deve.

Então, basta atribuir assim e deve funcionar number=${numbers[3]}

    
por 18.09.2017 / 16:02