2016-08-01 94 views
0

我需要讀取命令行參數。第一個參數是腳本名稱。第二個是重定向操作符,即「<」,第三個是輸入文件名。當我嘗試使用「$#」時,我得到0.當我使用「$ *」時,它沒有給我任何東西。我必須使用「<」這個操作符。我的輸入文件由所有用戶輸入數據組成。如果我不使用操作員,它會要求用戶輸入。有人可以幫幫我嗎?謝謝 !在bash中使用輸入重定向操作符讀取命令行參數

命令行:

./script_name < input_file 

腳本:

echo "$*"  # gave nothing 
echo "$#"  # gave me 0 

我需要讀取輸入文件名,並將其存儲到一些變量。然後我必須改變它的擴展。任何幫助/建議,應該感激。

+0

'./script_name input_file',然後'echo $ 1'。 – bishop

+0

我必須從我的輸入文件中讀取所有行。它具有所有的用戶輸入。如果我不使用該操作員,它會提示用戶輸入。 – Rock26

+2

顯示你的腳本,或等效的例子,所以我們可以看到它從標準輸入 – chepner

回答

2

當用戶運行:

./script_name <input_file 

...這是相當於正是,如果他們做了以下內容:從input_file

(exec <input_file; exec ./script_name) 

...第一重定向標準輸入,然後調用腳本名爲./script_name沒有任何參數

您可以使用操作系統特定的接口來獲取與句柄關聯的文件名(如果有的話),但使用其中一種會使您的腳本只能在操作系統上運行,接口;這不值得。

# very, very linux-specific, won't work for "cat foo | ./yourscript", generally evil 
if filename=$(readlink /proc/self/fd/0) && [[ -e $filename ]]; then 
    set -- "[email protected]" "$filename" # append filename to the end of the argument list 
fi 

如果你想在給出的參數,以避免提示輸入,並有這樣的說法的文件名,然後不採取它在標準輸入,但作爲一個參數,並做腳本內重定向自己

#!/bin/bash 

if [[ $1 ]]; then 
    exec <"$1" # this redirects your stdin to come from the file 
fi 

# ...put other logic here... 

...並讓用戶調用你的腳本:

./script_name input_file 

正如./yourscript <filename運行yourscriptfilename它的標準輸入的內容,腳本用./yourscript filename它調用exec <"$1"執行該命令後,將具有filename它的標準輸入的內容調用。

+0

謝謝@charles。它工作得很好。我感謝你的幫助和時間。 – Rock26

1

<用於輸入重定向。而且任何在<的右邊都不是命令行參數。

所以,當你做./script_name < input_file時,會有零(0)命令行參數傳遞給腳本,因此$#將爲零。

爲了您puprpose你需要打電話給你的腳本:

mv -- "$1" "${1}_new_extension" 

編輯

./script_name input_file 

而在你的腳本,你可以用類似改擴建這哪裏是什麼OP想要做。


雖然已經有了另一個答案,但爲了完整起見,我會寫出這個答案。如果你使用'<'重定向,你可以在你的腳本中做這樣的事情。

while read filename; do 
mv -- "$filename" "${filename}_bak" 
done 

並將腳本稱爲./script < input_file。但是請注意,在這種情況下,您將無法從stdin中接受輸入。

+0

需要更多引號(即''mv - 「$ 1」「$ {1} _new_extension」')。 '--'對於支持以破折號開頭的文件名是必要的。 –

+0

@CharlesDuffy好點。我編輯過。雖然看起來OP正在嘗試做其他事情,如現在所討論的評論中所見.. – sps

+0

謝謝@sps。我無法刪除「<」運算符。如果我這樣做,腳本會提示用戶輸入。我不希望用戶提供輸入,因爲它已經存在於input_file中。 – Rock26

相關問題