嵌套循环似乎跳过了Bash中的第二个循环

时间:2011-02-14 15:56:43

标签: bash while-loop nested-loops

我正在尝试编写一个脚本:

a)读取.csv文件的内容

b)将变量设置为第一个位置(即逗号左侧)的值

c)将变量值与数组中的每个位置进行比较。如果值在数组中执行一个命令,如果不是,则将该值插入数组中的第一个可用插槽。

.csv文件的格式为:

  

CO:7077,he17208am3200816internet.pdf,he17208am3200917internet.pdf   联合:7077,he17208am3200817internet.pdf,he17208am3200918internet.pdf   联合:7077,he17208am3200818internet.pdf,he17208am3200919internet.pdf   联合:7077,he17208am3200819internet.pdf,he17208am3200915internet.pdf   联合:7162,tra210051internet.pdf,tra21005101internet.pdf   联合:7162,tra210051appinternet.pdf,tra21005102internet.pdf   联合:7178,tra4157l11201021internet.pdf,tra4158l11201021internet.pdf   共:7178,tra4157l11201022internet.pdf,tra4158l11201022internet.pdf

到目前为止我的脚本看起来像:

#!/bin/bash

declare -a array
anum=0
src=source.csv
pid=0

while read line;
do
pid=$( echo $line | awk '{print$1}' FS=",")

  for n in "${array[@]}";
     do

        if [[ "$pid" = "$n" ]] ;
         then

          echo Duplicate value: "$pid";

         else
          array[$anum]="$pid"
          anum=$(( $anum +1 ))
        fi
     done
done < $src

echo ${array[@]}

执行脚本时,pid成功设置并在while循环的每次迭代时重置,但显然嵌套的for循环从不运行。

从我的谷歌开始,我怀疑它与pid系列中的管道有关,但如果我能弄明白如何使其工作,我将受到质疑。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您没有填充数组。永远不会执行for循环,因为数组是空的。

答案 1 :(得分:0)

为什么使用双方括号?而且你在if?

中使用了单个等于而不是双倍

试试这些单行......

$ if [ "a" == "b" ] ; then echo hello ; fi

$ if [ "a" == "a" ] ; then echo hello ; fi

答案 2 :(得分:0)

else子句中设置一个标志,而不是在那里添加数组元素。在for循环后,如果设置了标志,则添加数组元素。不要忘记取消标志。

您可以在没有下一行的情况下array[anum++](( anum++ ))而不是anum=$(($anum + 1))

另外:while IFS=, read -r pid discard如果你不需要剩下的那一行(如果你需要,可以稍微改变一下)。这样做,您将不需要echoawk