2013-10-02 167 views
2

我有一個名爲script.sh的BASH腳本,它接受3個參數並用它們運行一個可執行文件。前兩個只是數字,但最後一個是給出輸入文件的參數。我希望腳本運行帶有輸入的可執行文件作爲可執行文件的參數,並使用「<」作爲stdin的替代文件。 (即在BASH中運行變量命令

bash script.sh 5 1 input.txt 

調用bash腳本,並script.sh的內容如下:

#!/bin/bash 

command1="./l${1}t${2} $3" 
command2="./l${1}t${2} < $3" 

echo + ${command1} 
${command1} 

echo + ${command2} 
${command2} 

當我回聲命令1,我得到

./l5t1 input.txt 

這正是我想要和它運行得很好。

當我回顯command2我得到

./l5t1 < input.txt 

這又是我想要的。問題是腳本運行的實際命令是

./l5t1 '<' input.txt 

這當然引起我的程序分段錯誤。

我想知道是否有一種方法可以運行命令2,以便它完全按照在echo輸出中打印的那樣運行字符串。老實說,我不知道爲什麼單引號甚至插入在<字符周圍。

+1

不管怎麼說,你應該能夠'eval'變量的內容。 – Rubens

回答

4

如果要存儲命令,最好使用函數而不是變量。正如你發現的那樣,當存儲在變量中時,重定向不起作用(|,;&)。

command1() { 
    "./l${1}t${2}" "$3" 
} 

command2() { 
    "./l${1}t${2}" < "$3" 
} 

command1 "[email protected]" 
command2 "[email protected]" 

在這裏,我已經定義兩個函數,這是所謂的與從陣列[email protected]的參數。 "[email protected]"將腳本的參數轉發給函數。

另請注意,我已將報價放在"./${1}t${2}""$3"左右。使用雙引號允許這些參數包含空格。自由引用是一種很好的防禦性腳本技術。

(我強烈建議eval "$command2"。使用eval是一個非常危險的習慣進入。)

+0

這正是我需要的!感謝您的幫助和偉大的解釋! –