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

У меня проблема с моим массивом 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] пуст

  • Как я могу определить диапазон внутри столбца при создании файла awk?
  • GNU Parallel: как я могу ссылаться на элементы массива?
  • Рейдовый массив «чистый, деградированный»?
  • В цикле над массивом добавьте элемент в массив
  • Количество элементов в массиве
  • Поместите большие данные гетерогенного байтового смещения в массивы AWK
  • Как получить доступ к элементу массива в оболочке?
  • Как проверить, находится ли элемент в массиве 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 
    Interesting Posts

    Скопируйте метафайлы EXIF ​​из ключевых слов в описание на огромное количество фотографий в подпапках

    libotify / notify-send: основной текст не печатается, если он содержит '<' или '>'

    udev power_supply правила не запускают

    Launcher поверх X11 в качестве оконного менеджера

    найти с несколькими вариантами -exec; redirecting &> / dev / null для одной команды exec отправляет процесс в фоновый режим

    Найти каталог, если количество файлов превышает X

    связанный, но не прослушивающий процесс

    тире: как захватить вывод ловушки (вызванные без аргументов)?

    Рекурсивно удалить все файлы с заданным расширением

    Просмотр только новых записей в растущем файле журнала

    Создание и установка новой файловой системы на CentOS

    В init запустите собственный скрипт вместо оболочки

    Изменения в часовом поясе не применяются в CentOS 6

    Как вы можете назначить один IP на пользователя?

    Что означает `, и в` man test`?

    Linux и Unix - лучшая ОС в мире.