Shell脚本中的嵌套For循环未正确迭代数组

时间:2015-09-21 12:39:48

标签: arrays for-loop nested-loops

我正在尝试使用嵌套for循环来创建文件。我有三个数组如下:

    a=( 1000 2000 3000 )
    b=( 10515 7515 4515 )
    c=( 10 20 30 40 )

使用这些数组将指定我的for循环将搜索的文件(用于从预先存在的文件复制数据并将其复制到新创建的文件中)。

    for tom in "${tom[@]}"
    do
       for dick in "${dick[@]}"
       do
          for harry in "${harry[@]}"
          do
             FILENAME="this_is_file_${tom}_${dick}_c0.out"
             NEWFILE="this_is_newfile_${tom}_${dick}_${harry}.out"
             cat $FILENAME >> $NEWFILE
             awk 'NR==n{$3=a}1' n="${x}" a="${harry}" $NEWFILE &> tmp && mv tmp $NEWFILE
             mv $NEWFILE NewFiles
             done
          done
       done
    done

(我已经定义了x ="字符串")。到目前为止,我的代码在for循环经历一次迭代时生成所有文件HOWEVER,下一循环返回到最后一个数组值4515开始并跳过第一个10515值。我得到40个正确数字的文件,但是当tom的数组值为2000和3000时,dick的数组仅使用数组值7515和4515生成文件。它重复值4515两次给出以下内容文件列表:

this_is_newfile_1000_10515_10.out
this_is_newfile_1000_10515_20.out
this_is_newfile_1000_10515_30.out
this_is_newfile_1000_10515_40.out
this_is_newfile_1000_7515_10.out
this_is_newfile_1000_7515_20.out
this_is_newfile_1000_7515_30.out
this_is_newfile_1000_7515_40.out
this_is_newfile_1000_4515_10.out
this_is_newfile_1000_4515_20.out
this_is_newfile_1000_4515_30.out
this_is_newfile_1000_4515_40.out

这里是时髦的地方,关于汤姆的数组值2000的注意事项,迪克的值仍然是4515而不是循环回到10515.

this_is_newfile_2000_4515_10.out
this_is_newfile_2000_4515_20.out
this_is_newfile_2000_4515_30.out
this_is_newfile_2000_4515_40.out
this_is_newfile_2000_7515_10.out
this_is_newfile_2000_7515_20.out
this_is_newfile_2000_7515_30.out
this_is_newfile_2000_7515_40.out
this_is_newfile_2000_4515_10.out
this_is_newfile_2000_4515_20.out
this_is_newfile_2000_4515_30.out
this_is_newfile_2000_4515_40.out

(很抱歉很长的列表我想说清楚发生了什么)这重复了toms数组值为3000.任何人都可以帮忙吗?关于使用awk的行我还有另一个问题,我将在另一个条目中发布。

1 个答案:

答案 0 :(得分:0)

弄清楚我的问题。在For循环中,我使用tom,dick和harry作为变量。但是在定义它们时,数组是

SELECT to_char(p.created_at, 'day') AS day_of_week,
               p.price * p.quantity + p.tax * p.price * p.quantity AS sell,
               p.quantity * p.cost AS total_cost
FROM products p
  INNER JOIN jobs j ON j.id = p.job_id
  INNER JOIN users u ON u.id = j.user_id
WHERE j.billed != 0 AND j.start_date >= CURRENT_DATE - INTERVAL '7 DAY' AND u.id = 242
GROUP BY to_char(p.created_at, 'day'), sell, total_cost

变量名称与"计数器"相同for循环中的变量。

tom=(values)
dick=(values)
harry=(values)

它应该是这样的:

for tom in ${tom[@]}
do
   something
done

应该使用i或其他与tom不同的变量。这解决了这个问题。