book
é inicializado na matriz vazia pela linha book=()
, portanto, durante a primeira execução do loop book+=("$bookname")
, o primeiro elemento da matriz book
(ou seja, ${book[0]}
) é definido para o primeiro livro nome.
author
é usado às vezes como uma matriz e às vezes como escalar. Em ksh e bash, quando uma matriz é referenciada usando uma sintaxe escalar (ou seja, qualquer coisa diferente de ${VAR[INDEX]}
), o primeiro elemento da matriz é usado. Atribuir à variável de maneira diferente de VAR=…
, como por meio do read
builtin, define o primeiro elemento da matriz. Por outro lado, se uma matriz é esperada, uma variável escalar é tratada como uma matriz de uma palavra. Assim:
- Na primeira execução do loop,
author
contém a stringJ.K Rowling
e, em seguida,author+=("$author")
a define como uma matriz de dois elementos contendoJ.K Rowling
duas vezes. - Na segunda execução do loop,
read
define${author[0]}
aDan Lin
, entãoauthor+=("$author")
anexaDan Lin
, gerando a matriz de três elementos('Dan Lin' 'J.K. Rowling' 'Dan Lin')
. - …
- Na última execução,
read
vê uma linha vazia, por isso define$bookname
,${author[0]}
e os outros como uma string vazia.
Para corrigir isso, use um nome diferente para as variáveis de loop e para as matrizes onde você acumula os dados.
titles=()
authors=()
prices=()
quantities=()
sales=()
while read title author price quantity sold
do
titles+=("$title")
authors+=("$author")
prices+=("$price")
quantities+=("$quantity")
sales+=("$sold")
done < $INPUT