我有以下bash代码,用于批处理多个文件,由3个不同的程序处理:
for i in *.txt
do
program1 -in ${i} -out Prog1_out_${i}
program2 -in Prog1_out_${i} -out Prog2_out_${i}
program3 -in Prog2_out_${i} -out Prog3_out_${i}
done
我遇到问题,程序2没有找到输入,这是程序1的输出,当然程序3没有找到所需的输入。
任何人都可以帮忙解决问题吗?
由于
答案 0 :(得分:0)
如果程序在成功时产生输出,则可以使它们依赖于先前命令的成功,如下所示:
program1 -in ${i} -out Prog1_out_${i} &&
program2 -in Prog1_out_${i} -out Prog2_out_${i} &&
program3 -in Prog2_out_${i} -out Prog3_out_${i}
因此,如果其中一个程序失败,则不会调用链的其余部分。
但是,如果输出的创建与程序的成功无关,但您只想检查文件是否存在,则可以在调用programx之前添加相应的检查,即
if [ -f "${i}" ]
then
progx ...
fi
正如你一直在做同样的事情,这可以推广到所有程序(未经测试):
for i in *.txt
do
mv $i Prog0_out_$i
for program in 0 1 2
do
INFILE=Prog{$program}_out_${$i}
if [ ! -r ${INFILE} ]
then
break
fi
program{$program} -in ${INFILE} -out "Prog{$program}_out_$((i+1))"
done
done