2013-02-24 108 views
1

我试图在此论坛和其他论坛上找到答案。以下是应该在for循环中运行一系列命令的bash脚本。我正在阅读文件的2列。第一列有文件名列表(FARR),第二列有一个参数 - 处理中使用的数字(NARR)。它将运行FARR中每个文件的命令集,并在“do”后面的命令中使用文件名和参数。除了$ {NARR [$ N]}不会将参数添加到该行的末尾外,所有内容都可以正常工作。此阶段的参数为空。 使用echo $ NARR调出完整列表。所以数据在那里... 任何帮助将不胜感激。将变量作为索引传递给bash数组

#!/bin/bash 

DIR='gauss_data/' 
declare -i N=0 
FARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $1}') 
NARR=$(cat $DIR'all.dat' | awk '{if (NR!=1) print $2}') 
for f in $FARR; 
do 
    ./gauss_and_noise.py -i $DIR$f -o $DIR$f'.out' -d --save $DIR$f'.out.plot.png' --n0 ${NARR[$N]} 
    let "N++" 
done 
+2

你似乎熟悉Python。如果我是你,我会用Python重写这个bash脚本。 – piokuc 2013-02-24 00:21:34

+0

**提示:**在调试[tag:bash]脚本时,在shebang行下面添加'set -x'是非常有帮助的。 – Johnsyweb 2013-02-24 00:23:32

+0

我本来可以在python中做到这一点,但我自己教自己bash脚本,这似乎是一个很好的候选人。 – 2013-02-24 07:57:37

回答

3

你说NARR是一个数组,但你给它一个字符串值

也许改变这个

NARR=($(awk 'NR>1 {print $2}' "$DIR"all.dat)) 
+0

谢谢。这个伎俩。 – 2013-02-24 07:35:27

1

此外,遍历数组,使用此语法:

for f in "${FARR[@]}" 
0

你可以简单地通过使用while循环和read命令。循环之前的read用于消耗输入文件的第一行而不使用它。不需要阵列;在阅读时只使用每个输入行。

dir='gauss_data' 
declare -i N=0 
{ 
    read 
    while read f n rest; do 
     ./gauss_and_noise.py -i "$dir/$f.out" -d \ 
          --save "$dir/$f.out.plog.png" --n0 $n 
     ((n++)) 
    done 
} < $dir/all.dat