棘手的bash试图用不同的参数运行程序

时间:2014-10-09 19:59:02

标签: bash

我想使用不同的参数多次运行程序,然后将结果通过管道传递到名称中使用参数的文件中。以下是我的想法:

#!/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 ....或只是字符?这是不明确的。

3 个答案:

答案 0 :(得分:4)

  • 您必须使用变量$i$j$m等。
  • 最好在BASH中使用((...))构造。

在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做太多工作,但这似乎是合乎逻辑的。