2013-02-24 71 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