2012-08-17 48 views
7

Google終於讓我失望了。我似乎無法找到如何在Bourne shell腳本中執行此操作:

我正在編寫一個shell腳本來處理我的所有項目測試。我爲這個腳本可以執行的每個任務(構建,運行,清理等)設置了函數,並且想要將任何其他命令行參數(除了命令本身)傳遞到所需的函數上。

實施例:

./test.sh build -j應該通過-jbuild功能。

這種邏輯的僞代碼版本會是什麼樣子:

function build() { 
    make $* 
} 

if [ $1 == 'build' ]; then 
    build $2 -> $N 
fi 

我怎樣才能做到這一點?

回答

9

我想你可以使用shift命令來達到這個效果。它會將所有位置參數向下移動一個位置並丟棄值$1(因此$3的值被移動到$2$2的值被移動到$1,並且$1的值丟失)。完成之後,您可以使用[email protected]來選取您實際感興趣的參數列表,例如

function build() { 
    echo "build with [email protected]" 
} 

echo "Starting args are [email protected]" 
cmd=$1 
shift 

if [ "$cmd" = 'build' ]; then 
    build "[email protected]" 
fi 
+1

你應該在'build'的調用中使用''$ @''',否則就會出現。 – 2012-08-17 09:34:18

5
function build() { 
    make "[email protected]" 
} 

if [ "$1" == 'build' ] 
then shift  # Lose $1 
    build "[email protected]" # Pass what was $2 .. $N 
fi 

請注意函數本身以及函數的調用使用"[email protected]"兩者。我認爲使用$*[email protected]而不使用雙引號或"$*"是很少正確的;只有"[email protected]"保留了原始參數列表的間距,如果您的參數中包含空格,那麼這很重要。如果你打算迴應這些論點,那麼echo "The arguments: $*"是合理的。否則,超過90%的時間,你會更好使用"[email protected]"。在測試操作員中引用"$1"時,我也採取非常保守的態度;謹慎地省略引號。

參見:

2

除非你是想發出更詳細的錯誤信息,就沒有必要測試$1明確。只要做:

#!/bin/sh -e 
function build() { 
    make "[email protected]" 
} 

"[email protected]" 

如果$1命名一個有效的函數,它會根據需要調用。如果沒有,你會得到一個錯誤信息,這可能不是太糟糕,這取決於你的shell。

相關問題