Para uma matriz (digamos arr
), apenas referindo-se à matriz usando a notação usual de referência de variável $arr
é análogo a ${arr[0]}
, ou seja, isso se refere ao primeiro elemento da matriz. Isso é o que acontece no seu caso.
Se você quiser se referir a todos os elementos da matriz, quase sempre deseja usar "${arr[@]}"
, não "${arr[*]}"
. Porque, no último caso, quando citado assim, os elementos seriam mostrados como string única com o primeiro caractere de IFS
como separador, por padrão (quando IFS
é espaço, guia , newline), o espaço se torna o separador.
No caso em que ${arr[@]}
é sem aspas, ele se expande para todos os elementos da matriz com a divisão de palavras e a expansão do nome de caminho ocorrendo ainda mais.
Aqui está um exemplo para você:
$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22
Agora, no caso de b=$(echo "11 22")
, você está simplesmente fazendo a substituição de comandos e dentro dessa execução echo "11 12"
(em uma subshell), e o resultado está sendo salvo na variável b
, que não é um array . Portanto, você recebe 11 12
quando echo
-ing $b
.
Observe que o lado direito da atribuição de variáveis não passa pela divisão de palavras, portanto, a string 11 12
é salva na variável b
, mesmo que haja espaço entre elas.