使用变量问题在声明期间增加数组元素

时间:2013-04-13 08:05:46

标签: linux bash

所以是的,通常你会使用for循环或类似的方法增加一个数组,但在这种情况下,这是不可能的,因为我已经在循环中,只需要在数组中设置一个值并继续。这是代码:

n=1
cat databases/$IPS | grep -v \# | while read LINE; do
  ENDPOINT[$n]="`echo $LINE | cut -d":" -f1`";
  echo "TESTING: ${ENDPOINT[$n]}"
  let n++
done

因此while循环将从平面文件数据库中读取几行并将第一个冒号分隔值拉出,这需要存储在数组中。在这个项目上工作太久,事情变得越来越糟糕。我可能不得不重新考虑这一部分。

所以官方的问题是,如果不使用另一个循环,如何使用变量增加元素,以便我可以在当前的while循环中设置数组。

-----更新-----

我知道我想做什么似乎有点奇怪和非正统。所以while循环逐行读取数据库。在while循环的第一次迭代期间,数据库被读取并且数据库的第一行上的第一个“单元”作为数组元素1存储在数组中(或者可以是0,无关紧要)。然后while循环返回第二遍,并在数据库中拉出第二行的第一个单元格,它需要将它存储到元素2下的数组中。循环继续执行此操作,直到数据库结束。

所以我知道如何使用循环读取数组的内容,但我从未使用循环设置数组。我不能让数组中的元素号递增,这样当while循环执行下一遍时,它不会只是保持覆盖数组[1]

这有帮助吗?

-----更新-----

所以它看起来有点像。将此数据库值存储在此数组中的重点是因为它不仅在此while循环中使用(忽略不相关的代码)。但是我需要在脚本的其他地方使用这些值。

cat数据库/ $ IPS | grep -v#|同时阅读LINE;做   VAR = “echo $LINE | cut -d"|" -f1”;   ENDPOINT [$ N] = “$ VAR”   echo“继承数组变量:$ {ENDPOINT [$ n]}” 完成

问题仍然是它似乎并没有真正存储到数组中。它只是覆盖了数组中的第一个元素。如果我尝试回显脚本中某处的任何较低数组值,则唯一出现的是数组元素0中的值,并将其设置为数据库中的最后一个条目。

2 个答案:

答案 0 :(得分:0)

100%无法理解你的问题。我假设您无法访问while循环之外的数组元素。

这是因为whilecat命令上下文中执行,它是作为单独的进程启动的。要访问数组元素,必须在相同的bash上下文中设置它们的值。

例如,您可以使用sed获取冒号分隔值的第一个并处理注释:

file_name=data

# extract values and put it into bash array
ENDPOINT=(`sed 's/[ \t]*#.*//g;s/^\([^:]*\):.*/\1/g' $file_name`)

echo "size: ${#ENDPOINT[@]}"
echo "readed data: ${ENDPOINT[@]}"

此变体也比while read循环快得多,它可以调用另一个命令。

答案 1 :(得分:0)

我似乎是你正在执行一个命令,可能这是一个单独的进程,并且数组在完成时会丢失

请改为:

n=1
endpoints=`grep -v \# databases/$IPS | cut -d":" -f1`
for i in $endpoints; do
  ENDPOINT[$n]=$i;
  echo "TESTING: ${ENDPOINT[$n]}"
  let n++
done