2015-05-06 120 views
5

我正在寫一個bash腳本,它接受一些可選參數。我想翻譯它們並將它們傳遞給另一個腳本。但是,我很難適時地傳遞可選參數。如何將可選參數傳遞給bash腳本中的另一個命令?

這裏是什麼,我設法學會了僞工作綱要:

a.sh:

if arg1 in arguments; then 
    firstArg="first argument" 
fi 
if arg2 in arguments; then 
    secondArg="second argument" 
fi 

./b.sh $firstArg $secondArg "default argument" 

注意,在參數的空間。

b.sh:

for arg in "[email protected]" 
do 
    echo $arg 
done 

我想打電話給b.sh,任選firstArgsecondArg和默認參數,如下所示:

./b.sh $firstArg $secondArg "default argument" 

這樣做的問題是,如果$firstArg$secondArg是帶空格的字符串,它們將被表示爲多個參數,並且輸出將如下所示:

first 
argument 
second 
argument 
default argument 

好了,這是很容易解決,讓我們加入周圍的引號,像這樣獲取的參數的整個字符串:

./b.sh "$firstArg" "$secondArg" "defaultArg" 

問題是,如果,例如,firstArg沒有設置,它導致一個空行(因爲它會解釋""作爲參數),所以輸出會是這樣的:

(blank line here) 
second argument 
defaultArg 

我還試圖構建一個字符串,並將其傳遞給shell腳本,但它不似乎也以這種方式工作(it int將整個字符串作爲參數進行錯誤處理,即使我用引號分隔參數)。

請注意,從命令行調用b.sh引用的參數可以正常工作。有沒有辦法在bash腳本中模仿這種工作方式?

+1

旁白:就因爲我複製你的鉛和使用'.sh'擴展在可執行文件上(即具有'execv()' - 家族調用成功的+ x權限的文件)並不意味着這是個好主意。通常,UNIX中的命令不應該有任何擴展名,無論它們是通過shell腳本,Python腳本還是編譯的二進制文件提供的。 –

+0

您能否明確說明這是否適用於使用'#!/ * bin/sh'或'#!/ bin/bash'? –

+0

我正在使用bash。 – Andrew

回答

7

如果你硬是要複製給所有的參數,但增加一個:

# this works in any POSIX shell 
./b.sh "[email protected]" defaultArg 

另外,要明確地傳遞firstArgsecondArg,但只有當它們存在(注意設置到一個空 - 值計爲「現有」這裏):

# this works in any POSIX shell 
./b.sh ${firstArg+"$firstArg"} ${secondArg+"$secondArg"} defaultArg 

如果你要正確對待集到一個空值不存在:

# this works in any POSIX shell 
./b.sh ${firstArg:+"$firstArg"} ${secondArg:+"$secondArg"} defaultArg 

另一種方法是建立一個數組參數:

# this requires bash or another shell with arrays and append syntax 
# be sure any script using this starts with #!/bin/bash 
b_args=() 
[[ $firstArg ]] && b_args+=("$firstArg") 
[[ $secondArg ]] && b_args+=("$secondArg") 
b_args+=("default argument") 
./b.sh "${b_args[@]}" 

如果要使用相同的靈活性,因爲陣列的方法的東西,但如果沒有兼容性問題,定義一個函數;在它裏面,你可以安全地覆蓋"[email protected]"不會影響腳本的其餘部分:

runB() { 
    set -- 
    [ -n "$firstArg" ] && set -- "[email protected]" "$firstArg" 
    [ -n "$secondArg" ] && set -- "[email protected]" "$secondArg" 
    ./b.sh "[email protected]" "default argument" 
} 
+0

是不是在引用'「$ @」'這裏錯了?它不會再是分裂的話題了。不是嗎? – hek2mgl

+0

@ hek2mgl,呃?不,在這裏顯然不需要分詞。 –

+0

很好的答案!發佈評論時,我沒有正確地回答問題。 – hek2mgl

1

使用數組:

args=() 

if [ ... ]; then 
    args+=("first argument") 
fi 

if [ ... ]; then 
    args+=("second argument") 
fi 

./b.sh "${args[@]}" "default argument" 
+0

@EtanReisner不,它不是因爲在OP的例子中'$ firstArg'可能根本沒有被設置(但是被使用),但是如果它確實被設置了,它將被設置爲一個字符串字面值(在上面的代碼段中是相同的)。 –

+0

嗯,我認爲那些是實際的第一和第二個參數的佔位符,而不是字面字符串(在OP和這裏),並且由於你沒有對實際的參數本身進行測試,所以我沒有填寫這些參數。沒有這個問題,但正如所寫,這也只是解決方案的一半(我認爲不能很好地解決它)。 –

+0

我得到你從這裏來的地方。然而,將'./b.sh「$ firstArg」「$ secondArg」「defaultArg」'作爲一種可能的解決方案(並且將其唯一的錯誤描述爲通過空參數而不是完全不提供它們)的OP指示使用字面字符串''第一個參數「'和'」第二個參數「''在問題的早些時候就是不合時宜的。 –

相關問題