Eu tenho uma matriz
snapshots=(1 2 3 4)
Quando eu corro
printf "${snapshots[*]}\n"
Ele imprime conforme o esperado
1 2 3 4
Mas quando eu corro
printf "${snapshots[@]}\n"
Apenas imprime
1
sem uma nova linha. Meu entendimento é que acessar um array with @
deve expandir o array para que cada elemento esteja em uma nova linha, mas não parece fazer isso with printf
enquanto faz isso with echo
. Por que é isso?
printf
interpreta seu primeiro argumento como uma string de formato e imprime isso; quaisquer argumentos adicionais são usados apenas conforme necessário na string de formato.Com
printf "${snapshots[*]}\n"
, o primeiro argumento são os elementos do array unidos com o primeiro caractere de$IFS
(espaço por padrão) seguido de barra invertida en
:"1 2 3 4\n"
. Impressão que mostra todos os valores do array separados por espaços e seguidos por uma nova linha.Com
printf "${snapshots[@]}\n"
, o primeiro argumento é a primeira entrada na matriz,"1"
e o restante da matriz é fornecido como argumentos separados para a string de formato usar. O último argumento foi\n
anexado:"2" "3" "4\n"
. Como a string de formato não faz referência a nenhum argumento adicional, todos eles são ignorados. Tudo o que é gerado é o primeiro valor, sem nova linha a seguir.Para ver todos os valores ao usar
@
, você precisa fornecer uma string de formato real:Uma string de formato contendo uma referência a argumentos é repetida quantas vezes forem necessárias para consumir todos os argumentos. Portanto, uma única referência é suficiente para imprimir todos os valores do array, aqui com cada um seguido por um caractere de nova linha.