我试图在这个和其他论坛上找到答案。以下是一个bash脚本,它应该在for循环中运行一系列命令。我正在从文件中读取2列。第一列有文件名列表(FARR),第二列有一个参数 - 处理中使用的数字(NARR)。它将为FARR中的每个文件运行一组命令,并在“do”之后的命令中使用文件名和参数。尽管$ {NARR [$ N]}没有将参数添加到行尾,但一切正常。此阶段的参数为空白。 使用echo $ NARR会显示完整列表。那么数据就在那里...... 任何帮助将不胜感激。
#!/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
答案 0 :(得分:3)
你说NARR
是一个数组,但你给它一个字符串值
也许改为这个
NARR=($(awk 'NR>1 {print $2}' "$DIR"all.dat))
答案 1 :(得分:1)
此外,要迭代数组,请使用以下语法:
for f in "${FARR[@]}"
答案 2 :(得分: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