Баш-массив не хранится правильно

У меня проблема с моим массивом bash, который я пытался прочитать файл, однако массив выделил его в массиве [1] вместо 0

#!/bin/bash index=0 INPUT=BookDB.txt OLDIFS=$IFS IFS=: i=0 book=() [ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; } while read bookname author price quantity sold do #echo "BookName : $bookname" #echo "Author : $author" #echo "Price : $price" #echo "Quantity : $quantity" #echo "Sold : $sold" book+=("$bookname") author+=("$author") price+=("$price") quant+=("$quantity") sold+=("$sold") done < $INPUT IFS=$OLDIFS # Use c style for loop # get total subscripts in an array total=${#book[*]} # for (( i=0; i<=$(( $total -1 )); i++ )) do echo $i "${book[$i]} " done total=${#author[*]} # for (( i=0; i<=$(( $total -1 )); i++ )) do echo $i "${author[$i]} " done 

Вот вывод файла

Книга

 0 Harry Potter - The Half Blood Prince 1 The little Red Riding Hood 2 Harry Potter - The Phoniex 3 Harry Potter - The Deathly Hollow 4 Little Prince 5 Lord of The Ring 6 Three Little Pig 7 All About Ubuntu 8 Catch Me If You Can 9 Happy Day 

автор

 0 1 JK Rowling 2 Dan Lin 3 JK Rowling 4 Dan Lin 5 The Prince 6 Johnny Dept 7 Andrew Lim 8 Ubuntu Team 9 Mary Ann 10 Mary Ann 

Как-то массив для автора [0] пуст

  • Использовать переменную как часть имени массива?
  • Почему мой массив bash всегда имеет длину 1, когда я разделяю?
  • Хранить массив в файл и загружать массив из файла в BASH
  • Сортировка массива путей файлов по их базам
  • Как найти файлы на основе массива
  • Прочитать файл, удалить пробелы и сохранить в массиве
  • Перебирать ассоциативные массивы подстрокой
  • объединение 3 отдельных массивов в один многомерный массив в bash
  • One Solution collect form web for “Баш-массив не хранится правильно”

    book инициализируется пустым массивом с помощью строки book=() , поэтому во время первого прогона в book+=("$bookname") циклов book+=("$bookname") устанавливается первый элемент книги массивов (например, ${book[0]} ), чтобы первое название книги.

    author иногда используется как массив, а иногда и как скаляр. В ksh и bash, когда массив ссылается с использованием скалярного синтаксиса (т.е. ничего, кроме ${VAR[INDEX]} ), используется первый элемент массива. Присвоение переменной переменной, отличной от VAR=… , например, с помощью встроенного read , задает первый элемент массива. И наоборот, если ожидается массив, скалярная переменная рассматривается как массив с одним словом. Таким образом:

    • При первом прогоне цикла author содержит строку JK Rowling , тогда author+=("$author") устанавливает его в двухэлементный массив, содержащий JK Rowling дважды.
    • На втором прогоне через цикл read множества ${author[0]} Dan Lin , затем author+=("$author") добавляет Dan Lin , уступая трехэлементному массиву ('Dan Lin' 'JK Rowling' 'Dan Lin') .
    • В последнем прогоне read видит пустую строку, поэтому он устанавливает $bookname , ${author[0]} а остальные – в пустую строку.

    Чтобы исправить это, используйте другое имя для переменных цикла и массивов, в которых вы накапливаете данные.

     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 
    Linux и Unix - лучшая ОС в мире.