Файл базы данных текстового файла Bash читается в цикле

Может ли кто-нибудь увидеть последнюю синтаксическую ошибку, которую я здесь сделал? Проблема заключается в увеличении массива FIELDS базы данных "X". В некотором смысле, я имитирую mutlidimensional массив, сохраняя все записи из каждой базы данных в свой собственный массив, чтобы их можно было вызвать позже. Я не могу понять синтаксис, чтобы объявить массив БД, используя встроенную переменную, которая увеличивается. Возможно, мне просто нужно сначала задать имя (включая переменную, а затем объявить массив).

function DATABASE.READ {
 cd databases
 DBARRAY=(*)
 cd ..
 local i
 local j
 for i in "${!DBARRAY[@]}"; do
 declare -a DB$iFIELDS ### Here is the problem. Declaring the array.
 while read LINE; do 
 for (( j=1; j<=25; j++ )); do
 VALUE="'echo $LINE | cut -d"|" -f"$j"'";
 DB$iFIELDS[$j]="$VALUE" ### Also here, which I believe requires a different syntax
 done
 done < <(grep -v '#' databases/${DBARRAY[$i]})
 done
}

* ОБНОВИТЬ *

Хорошо, поэтому у меня было большое осознание того, что я упускаю из виду все измерение базы данных. С тех пор я пересмотрел код, чтобы создать дополнительные массивы для хранения всей информации базы данных. Да, я знаю, что это начинает немного выходить из-под контроля. Тем не менее, я ценю всю помощь. благодаря

function DATABASE.READ {
 cd databases
 DBARRAY=(*)
 cd ..
 local i
 local j
 local k
 i=1
 j=1
 for i in "${!DBARRAY[@]}"; do
 while read LINE; do
 declare -a "D${i}R${j}F"
 for (( k=1; k<=25; k++ )); do
 VALUE="'echo $LINE | cut -d"|" -f"$k"'";
 eval "D${i}R${j}F[$k]=\"$VALUE\""
 done
 let j=j+1
 done < <(grep -v '#' databases/${DBARRAY[$i]})
 done
 ########## EXAMPLE ECHO OF ONE SPECIFIC FIELD IN DATABASE1 RECORD1 FIELD1 ##########
 echo "${D1R1F[1]}"
}

* ОБНОВИТЬ *

Спасибо вам обоим. По-прежнему существует небольшая логическая ошибка, с которой я сталкиваюсь с проблемой идентификации, но я уверен, что она намного проще, чем то, что мы первоначально искали. Оригинальная проблема, похоже, решена благодаря вам, ребята. Вот текущий код:

function DATABASE.READ {
 cd databases
 DBARRAY=(*)
 cd ..
 local i
 local j
 local k
 i=1
 for i in "${!DBARRAY[@]}"; do
 j=1
 while read LINE; do
 declare -a "D${i}R${j}F"
 for (( k=1; k<=25; k++ )); do
 VALUE="'echo $LINE | cut -d"|" -f"$k"'";
 printf -v "D${i}R${j}F[$k]" '%s' "$VALUE"
 done
 let j=j+1
 done < <(grep -v '#' databases/${DBARRAY[$i]})
 unset j
 done
 ########## ECHO TWO SPECIFIC FIELDS IN EACH DATABASE ##########
 echo "${D1R1F[1]}"
 echo "${D2R1F[1]}"
 echo "${D3R1F[1]}"
 echo "${D1R1F[3]}"
 echo "${D2R1F[3]}"
 echo "${D3R1F[3]}"
}

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

* РЕШЕНИЕ *

Таким образом, похоже, что проблема связана с приростом базы данных. Когда я специально не устанавливаю я и не указываю базы данных, начинающиеся с 0. Это исправляет. На самом деле... это имеет смысл сейчас. Когда файлы DB считываются в DBARRAY, они начинаются с элемента 0, так что да.....

Итак, кто из вас тоже даю кредит? :)

1 ответ

Попробуйте следующую обновленную версию:

function DATABASE.READ {
 cd databases
 DBARRAY=(*)
 cd ..
 local i
 local j
 local k
 i=1
 j=1
 for i in "${!DBARRAY[@]}"; do
 declare -a "DB${i}FIELDS"
 while read LINE; do
 declare -a "D${i}R${j}F"
 for (( k=1; k<=25; k++ )); do
 VALUE="'echo $LINE | cut -d"|" -f"$k"'";
 echo "VALUE = '$VALUE'"
 eval "D${i}R${j}F[$k]=\"$VALUE\""
 eval "echo ${D${i}R${j}F[$k]}"
 done
 let j=j+1
 done < <(grep -v '#' databases/${DBARRAY[$i]})
 done
 ########## EXAMPLE ECHO OF ONE SPEFIC FIELD IN ##########
 echo "${D1R1F[1]}"
}

licensed under cc by-sa 3.0 with attribution.