Bash文本数据库文件读入循环

时间:2014-04-30 18:35:41

标签: arrays database bash while-loop

有人能看到我在这里犯的最后一个语法错误吗?问题在于增加DB" X" FIELDS数组。在某种程度上,我通过将每个数据库中的所有记录存储到自己的数组中来模拟多维数组,以便稍后调用它们。我无法弄清楚语法通过使用增量的嵌入变量来声明DB数组。也许我只需要先设置名称(包括变量,然后声明数组。

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记录。试图弄清楚循环中的内容是什么,或者它可能是一个更大的问题。

*解决方案*

所以看起来问题在于数据库递增。当我没有专门设置i时,从0开始引用数据库。它修复了它。实际上......现在有意义了。当DB文件被读入DBARRAY时,它们从元素0开始,所以是啊......

那么你也应该给予信任呢? :)

1 个答案:

答案 0 :(得分:0)

请尝试以下更新版本:

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]}"
}