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

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

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 
  • найти дубликат в первых, вторых столбцах и числах в третьем столбце
  • Длина массива скриптов Bash Shell Off by One
  • Баш-массив содержит ложные срабатывания
  • Как добавить ассоциативный массив к переменной из внешнего INI-файла?
  • Что такое массив в awk?
  • Как динамически читать переменные из stdin и хранить их в массиве
  • Возьмите вывод массива и поместите в новый массив (perl-скрипт)
  • Найти позицию совпадающего слова в строке в bash (не в позиции символа)
  • Сравнение массива Баша
  • есть ли способ перечислить все «идентификаторы индексов» (ключи) в переменной ассоциативного массива bash?
  • Основной вопрос Баша
  • Сохранить результат grep для массива
  • Linux и Unix - лучшая ОС в мире.