2014-10-09 50 views
3

我想用不同的參數多次運行一個程序,然後將結果傳送到使用其名稱中的參數的文件中。這是我想出的:Tricky 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 ....還是隻是字符?它含糊不清。

+1

你的箭頭倒退了嗎? '> results_ijm.txt' ...等等......增加了一個可能解決一些問題的答案。 – JNevill 2014-10-09 20:02:11

回答

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 
+0

將'results_ijm.txt'轉換爲使用'i','j'和'm'的值嗎? – 2014-10-09 20:09:33

+0

謝謝@LukeWillis:現在糾正。 – anubhava 2014-10-09 20:10:45

3

兩個問題。正如我在評論中提到的那樣,你的箭頭倒退了。我們希望程序的結果從標準輸出轉到文件,以便翻轉那些東西。其次,變量在使用時會在他們面前獲得美元符號......所以它不會含糊不清。

編輯補充:第三件事,使用反引號而不是單引號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 
+3

第三:單引號代替反引號。 – PSkocik 2014-10-09 20:08:48

+1

補充說。我被這個向後的箭放下了,我錯過了那些不那麼明顯的東西。 – JNevill 2014-10-09 20:13:37

0
./program -s i -v j -k m ../input_files/input_file1.txt < results_ijm.txt 

相信小於符號應翻轉大於,從而輸入到文件,而不是從文件。我沒有用bash工作太多,但似乎合乎邏輯。

相關問題