Bash将值附加到for循环内的列表中

时间:2018-04-11 14:47:30

标签: bash shell unix

我有以下bash脚本序列:

blocks=()

for line in ${fail_no[@]}
do
  new_line=`sed "$line!d" $1`
  command=`echo $new_line | cut -d ',' -f2`
  while [[ $new_line != *"$PROJ_NAME"* ]] 
  do
    line=$((line-1))
    new_line=`sed "$line!d" $1`
  done
  curr_block=`echo $new_line | cut -d ',' -f1`
  echo $curr_block
  blocks+=("$curr_block")
done

echo $blocks

请忽略详细信息,但我只想将curr_block的所有值添加到列表blocks中。当我运行此脚本时,我有curr_block的2个值,但最后的block变量只包含第一个curr_block的值,而不包含第二个{或者之后的值{1}}是这样的)。我一直在看这个1小时,我看不出问题出在哪里。

2 个答案:

答案 0 :(得分:2)

blocks是一个数组。使用echo $blocks将打印第一个元素(如您所见)。

打印数组所有元素的正确方法如下:

echo "${blocks[@]}"

答案 1 :(得分:2)

我会用这样的东西:

readarray -t blocks < <(
  awk -F, -v pname "$PROJ_NAME" '
      BEGIN { fail=('"${fail_no[*]}"'); }
      $0 ~ pname {block=$1};
      NR in fail { print $block; }
      ' "$1")

单个awk进程逐行遍历文件,如果遇到与列出的一行匹配的行,则始终记住block 的当前值的内容在fail_no。如果是,输出该块。然后将awk的输出收集到所需的数组中。