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,
authorcontém a stringJ.K Rowlinge, em seguida,author+=("$author")a define como uma matriz de dois elementos contendoJ.K Rowlingduas vezes. - Na segunda execução do loop,
readdefine${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,
readvê 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