2017-01-28 38 views
0

我有腳本正在採取一個參數($ 1)。所以我像這樣運行它:bash script.sh file1.txt。但是當我想要替換更多的文件(bash script.sh *)時,他只從一個文件中獲取一個文件。我怎樣才能使它工作?應該有另一個腳本,將文件夾中的所有文件替換爲$ 1到script.sh或有更簡單的方法嗎?(Bash)如何將許多文件替換爲腳本?

#!/bin/bash 
sed -i '/^$/d' [email protected] 
declare -a command 
while read -r line 
do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
done<"[email protected]" 

它不適用「$ @」。

你能幫助我嗎?

+0

在腳本中是否使用'「$ @」'完成你想要的? –

+0

[如何迭代Bash腳本中的參數]可能的副本(http://stackoverflow.com/questions/255898/how-to-iterate-over-arguments-in-a-bash-script) – SLePort

+0

您也可以使用'shift'。如果你的論點是A B C,那麼$ 1是「A」,$ 2是「B」等等。執行轉換後,「A」將消失,$ 1將變爲「B」等等。 – linuxfan

回答

1

代碼中的循環被設計爲遍歷給定文件的所有行。您需要添加一個外部循環來遍歷每個文件。

#!/bin/bash 
sed -i '/^$/d' "[email protected]" 
for file in "[email protected]" 
    while read -r line 
    do 
    [[ "$line" =~ ^secretcommand$ ]] || continue 
    read -r cmd || break 
    eval "$cmd" 
    break 
    done<"$file" 
done 

請注意,您需要引用「$ @」只要你想使用它作爲一個參數列表命令(如上面的sed命令)。

+0

非常感謝您的幫助!當我像這樣運行它時它工作正常:「bash script.sh *」,但是當我想以這種方式使用它時:「sh script.sh *」然後我的輸出有一些問題,並且工作不太多。這是爲什麼?將腳本作爲bash和sh運行有什麼不同?我用這個腳本在文件中找到「secretcommand」,在下一行總是我想要在控制檯中運行的命令。我正在用sed空行刪除,因爲有時在我的文件中,關鍵字和命令之間有一些空行,而我的腳本只有在下一行中的命令正確時才起作用。 – Anna

+0

我建議的代碼使用特定於bash的語法(您的問題標記爲「bash」)。 'sh'可能是一個不同的shell,所以如果以'sh'運行,這個語法將不起作用。你在腳本中包含了第一行(帶#!/ bin/bash)嗎? – Fred

+0

你在腳本中包含了第一行(帶#!/ bin/bash)嗎?如果是這樣,你可以'chmod u + x'這個腳本運行它,就像它是一個程序一樣(右邊的shell將自動使用)。 – Fred