while循环变量包含

时间:2014-01-17 17:37:22

标签: bash while-loop increment

我有以下while循环:

while read LINE; do
  VALUE="`echo $LINE | cut -d"|" -f1`";
done

注意f1。这是我使用cut的常规方式。这一次,我需要像这样增加f1:

while read LINE; do
  VALUE="`echo $LINE | cut -d"|" -f$COUNT`";
done

我无法弄清楚正确的语法。有人可以帮帮我吗?谢谢!

*更新*

这是我的完整代码(如果这有助于更多)

declare -a FIELDS
local i
for i in "${!DBARRAY[@]}"; do
  local COUNT=1
  while read LINE; do
    VALUE="`echo $LINE | cut -d"|" -f$COUNT`";
    FIELDS[$COUNT]="$VALUE"

      Do stuff to each element of array here

    let COUNT=COUNT+1
  done < <(grep -v '#' databases/${DBARRAY[$i]})
done

*更新*

好的,我刚刚意识到我的逻辑是有缺陷的。第一个for循环是遍历所有数据库。 while循环是遍历单个数据库中的每一行。我需要第三个循环来将每个字段存储到数组中。请参阅以下更新代码:

declare -a FIELDS
local i
local j
for i in "${!DBARRAY[@]}"; do
  local COUNT=1
  while read LINE; do
    for (( j=1; j<=24; j++ )); do
      VALUE="`echo $LINE | cut -d"|" -f"$j"`";
      FIELDS[$j]="$VALUE"
      echo "${FIELDS[$j]}"
    done
    let COUNT=COUNT+1
  done < <(grep -v '#' databases/${DBARRAY[$i]})
done

此代码工作正常!

2 个答案:

答案 0 :(得分:1)

您可以使用read命令自行拆分行:

for i in "${!DBARRAY[@]}"; do
    while IFS='|' read -ra FIELDS; do
        printf "%s\n" "${FIELDS[@]}"
    done < <(grep -v '#' databases/${DBARRAY[$i]})
done

http://www.gnu.org/software/bash/manual/bashref.html#index-read

答案 1 :(得分:0)

好的,我刚刚意识到我的逻辑是有缺陷的。第一个for循环是遍历所有数据库。 while循环是遍历单个数据库中的每一行。我需要第三个循环来将每个字段存储到数组中。请参阅以下更新代码:

declare -a FIELDS
local i
local j
for i in "${!DBARRAY[@]}"; do
  local COUNT=1
  while read LINE; do
    for (( j=1; j<=24; j++ )); do
      VALUE="`echo $LINE | cut -d"|" -f"$j"`";
      FIELDS[$j]="$VALUE"
      echo "${FIELDS[$j]}"
    done
    let COUNT=COUNT+1
  done < <(grep -v '#' databases/${DBARRAY[$i]})
done

此代码可以解决!