2011-08-22 31 views
3

好的,我的Unix腳本編寫技能顯然非常生疏。我想要做的就是有一個帶有4個參數的文件,我想將它們傳遞給腳本,就好像它們來自命令行一樣。但奇怪的是這樣做:簡單的Unix重定向問題:將文件中的行作爲命令行參數傳遞給腳本

./myscript.sh < mycmds.txt 

似乎並沒有按我期望的方式工作。 myscript.sh的內容是:

cat >> out.txt <<EOF 
$1 $2 $3 $4 
EOF 

所以,如果我運行命令行myscript.sh這樣的:./myscript.sh test1 test2 test3 test4一切都很正常,我看到test1 test2 test3 test4在out.txt文件中顯示出來。但是,如果我將test1 test2 test3 test4作爲一行放入名爲mycmds.txt的文件中,然後運行./mysript.sh < mycmds.txt,我只需在out.txt文件中獲得一個空行。

那麼我在這裏做錯了什麼?在文件中存儲參數並將它們傳遞給腳本的正確方法是什麼,以便將它們視爲來自命令行?

回答

6

爲了使mycmds.txt可作爲命令行參數的內容,當你調用myscript.sh只是內聯內容:

./myscript.sh $(< mycmds.txt) 
+0

Ooo ..我喜歡'$(<文件)'的外觀。 +1 –

+0

謝謝,這似乎乾淨,簡單,有效。不知道爲什麼當我谷歌「輸入重定向unix」沒有提及更多,但也許它是一個語義的東西。不管怎樣,謝謝。 – Fraggle

+0

從* bash *手冊:「命令替換$(cat文件)可以被替換爲等效但更快的$(<文件)」。它與輸入重定向很少有關係,所以不要把它看作是'

1

這是因爲<是輸入重定向,並將作爲標準輸入該行的過程中,與命令行參數完全沒有關係。

你可以這樣做:

./myscript.sh $(cat mycmds.txt) 

$(xyz)結構運行xyz然後使用它的標準輸出,構建命令的那部分。例如:

ls $(expr 1 + 3) 

將嘗試給你叫4的文件directoy上市,具體如下。

首先執行命令expr 1 + 3並輸出4。然後這被替換爲外部命令給你ls 4並且被執行。

+0

謝謝。我選擇了一個不同但相似的答案。我想我很困惑爲什麼<不傳遞文件的內容,就好像它們是在命令行輸入的一樣。我認爲這是重點。很明顯,我在這裏錯過了一些微妙之處,需要使用$。 – Fraggle

0

您錯過的微妙之處在於標準輸入和位置參數不是一回事。

標準輸入,您可以使用'<'重定向標準輸入,甚至可以使用'|'輸入另一個程序是一個字節序列。腳本可以讀取標準輸入,以及read命令。

位置參數編號爲1到N並保存每個參數的值。 shell將它們稱爲$ 1到$ {42}(如果你給了那麼多)。

標準輸入和位置參數是相互獨立的。你可以有兩種,要麼,或沒有,這取決於你如何調用程序(和程序需要什麼):

  1. 兩種:grep -E pattern < file
  2. 只是標準輸入:wc < file
  3. 只是位置paramters:echo Here are five positional parameters
  4. 都不是:ls
相關問題