2017-09-22 104 views
0

我正在製作一個採用可選標準輸入的shell腳本。我有下面的代碼片段。 $ {file}只是一個寫在包含所有文件名列表的txt文件中的文件名。在這種情況下$ 2將是另一個程序(也是一個shell腳本)。Bash字符串中特殊字符'<'的問題?

 if [ -f ${file}.in ]; then #if ${file}.in exists in current directory 

       stdIn="< ${file}.in" #set optional stdIn 

     fi 
     if ! [ -f ${file}.args ]; then #if ${file}.args does not exist in curr directory 

       $2 $stdIn > ${file}.out #run the $2 program with the optional standard input and redirect the output to a .out file 

由於某些原因,'<'字符解釋不正確。如果我改變了行

$2 < $stdIn > ${file}.out 

,並從標準輸入變量刪除「<」這工作得很好。但我不想這樣做,因爲我將不得不對其他代碼進行重大更改。任何人都知道什麼和如何解決我的當前代碼的問題?非常感謝。

+1

請仔細閱讀http://mywiki.wooledge.org/BashFAQ/050和http://mywiki.wooledge.org/BashParser,這裏的問題是,重定向變量擴展之前發生的,所以'<'只是另一個角色,不是特別的。 –

回答

2

您不能將<運算符存儲在變量中。相反,正確的做法是無條件地重定向來自stdIn中存儲的文件名的輸入,並將其初始化爲/dev/stdin,以便您只需從標準輸入讀取,如果沒有其他輸入文件是合適的。

stdIn=/dev/stdin 

if [ -f "${file}.in" ]; then 
    stdIn="${file}.in" #set optional stdIn 
fi 
if ! [ -f "${file}.args" ]; then 
    "$2" < "$stdIn" > "${file}.out" 
fi