2010-08-12 31 views
1

我有一個bash函數(略微簡化的解釋)如何編寫一個對傳遞參數動態的bash腳本函數?

copy_to() { 
    cp $1 $2 $3 
} 

這工作得很好:

copy_to -f /demo/example1.xml new_demo/ 

但是比方說,我想複製所有的XML文件,下面的代碼會有問題:

copy_to -f /demo/*.xml new_demo/ 

很顯然,我可以只寫cp -f /demo/*.xml new_demo/,但反正是有得到copy_to功能的文件列表的工作(這傳遞的不僅僅是3個參數)以及單個文件?

+0

$ @是嗎?也許... – jtbandes 2010-08-12 07:09:20

回答

5

[email protected]$*其中包含所有參數的列表。你應該使用[email protected],因爲它在雙引號內工作。否則,包含空格的文件名會破壞您的代碼。

copy_to() { 
    cp "[email protected]" 
} 

如果參數之一是特殊的,你可以使用shift命令從參數列表中刪除它,就像這樣:

example() { 
    destination="$1" 
    shift 
    echo "copying [email protected] to $destination" 
} 

shift從列表中移除的第一個參數,因此您必須先將其保存在其他位置。撥打shift後,$1的內容將爲$2,$2將包含的內容爲$3等等。 [email protected]擴展爲所有參數(不包括那些被shift刪除的參數)。

請注意,您不能從參數列表的僅從一開始就移除參數。

+0

當然,你可以抓住最後一個元素,然後取消它,這基本上和結束時一樣。 – Cascabel 2010-08-12 12:54:33

+0

雖然這樣做比較複雜。你會怎麼做?是否還有POSIX兼容的方式來做到這一點? (是的,我知道這個問題說的是「bash」,但大多數人不知道它們的區別,只寫一個shell是不好的。) – scy 2010-08-12 13:12:35

+0

在Bash中,除了最後一個參數外,你可以像這樣訪問所有的參數:'$ {@:0:$(($ {#@} - 1))}'(減去2以省略最後兩個等)。僅爲單一shell編寫並不總是很糟糕 - 爲什麼其他shell如果你要使用的是POSIX(或原始的Bourne)子集? – 2010-08-12 15:13:29

2

由於Scytale表示$ @和$ *包含所有參數的列表。 $#包含參數計數。

您可以考慮使用getopts command進行參數解析。

問候

+0

@Jefromi我編輯$ 0到$ @。 – dlamblin 2015-03-22 19:59:08

+0

謝謝@Jefromi – sourcerebels 2015-03-23 08:40:47