2008-10-14 71 views
4

我有兩個腳本,經常需要使用相同的參數來運行:如何在不同參數的bash中重複使用命令?

$ populate.ksh 9241 && check.ksh 9241 

當我需要改變(在這個例子中)的參數,我可以回去和編輯在歷史上的線。但是由於我需要在兩個地方改變這個數字,所以我有時會犯一個錯字。我希望能夠只改變一次參數來在兩個地方改變它。

回答

10

在bash:

!!:gs/9241/9243/ 

是的,它使用gs///,而不是s///g。 :-)

(zigdon的答案使用的最後一個命令開始pop,如populate.sh。我的回答使用的最後一個命令,句號,選擇一種適合你。)

1

一種解決方案是簡單地創建一個包裝腳本(populate_check.ksh),反過來調用腳本:

r=$1 
populate.ksh $r && check.ksh $r 

或者多個參數:

for r; do 
    populate.ksh $r && check.ksh $r 
done 

對於那些任務更短暫,您還可以參數化命令,以便在歷史中編輯更容易:

$ r=9241; populate.ksh $r && check.ksh $r 

或者做幾一次:

$ for r in 9241 9242; do populate.ksh $r && check.ksh $r; done 
+0

不要說「對r $ *」;寧願說「替代」。後者允許您使用空格或其他IFS字符指定參數。 – 2008-10-14 20:24:27

+0

對於潛伏者和檔案:對於那些不幸使用不支持較短形式的shell的人,「for r」等同於「$ @」中的r。 – 2008-10-14 20:25:31

5

您還可以使用歷史替換功能:

!pop:gs/9241/1234 

像這樣:

$ populate.ksh 9241 && check.ksh 9241 
... 
$ !pop:gs/9241/1234 
populate.ksh 1234 && check.ksh 1234 
... 
1

正確答案已經給出,但爲了更全面的理解,請閱讀手冊頁,特別注意「History Expansion」和相關的shell變量(如「HISTCONTROL」,「histchars」等)。順便說一句 - 你的尋呼機的搜索功能是非常有用的,當閱讀man bash