我想使用不同的参数多次运行程序,然后将结果通过管道传递到名称中使用参数的文件中。以下是我的想法:
#!/bin/bash
for i in 'seq 1 5';
do
for j in 'seq 1 8';
do
for m in 'seq 1 8';
do
./program -s i -v j -k m ../input_files/input_file1.txt < results_ijm.txt
done
done
done
这不起作用。它说“没有文件results_ijm.txt”....我知道 - 我希望它隐式地创建这个文件。
否则,我也怀疑它会正确地在文件名中分配ijm - 它是如何知道我是否想要VARIABLES ijm ....或只是字符?这是不明确的。
答案 0 :(得分:4)
$i
,$j
,$m
等。((...))
构造。在BASH,你可以这样做:
#!/bin/bash
for ((i=1; i<=5; i++)); do
for ((j=1; h<=8; j++)); do
for ((m=1; m<=8; m++)); do
./program -s $i -v $j -k $m ../input_files/input_file1.txt > "results_${i}${j}${m}.txt"
done
done
done
答案 1 :(得分:3)
两个问题。正如我在评论中提到的,你的箭头是倒退的。我们希望程序的结果从stdout转到文件,以便翻转那个东西。其次,变量在使用时会在他们面前获得一个美元符号......所以它不会含糊不清。
编辑添加:第三件事,使用反引号而不是seq 1 5
的单引号你想要该命令的结果,而不是文本“seq 1 5”。谢谢@PSkocik
#!/bin/bash
for i in `seq 1 5`;
do
for j in `seq 1 8`;
do
for m in `seq 1 8`;
do
./program -s $i -v $j -k $m ../input_files/input_file1.txt > results_${i}${j}${m}.txt
done
done
done
答案 2 :(得分:0)
./program -s i -v j -k m ../input_files/input_file1.txt < results_ijm.txt
我认为应该将小于符号翻转到大于,以便输入到文件而不是文件。我没有用bash做太多工作,但这似乎是合乎逻辑的。