2012-11-21 82 views
2

將參數傳遞給函數時,如何將參數分組爲單個參數? 例如shell腳本中的分組

,如果我的腳本文件「my_script.sh」有一個像

echo_arguments() { 
    echo $1 
    } 
    echo_arguments $1 

功能現在在UNIX命令行中,如何作爲一個參數指定的參數?

./my_spcript.sh a b c d  #these "a b c d" must fit in $1 

回答

1

可以將多個字成在幾個方面一個參數:

./my_spcript.sh 'a b c d' 
./my_spcript.sh "a b c d" 
./my_spcript.sh a\ b\ c\ d 

基本上,他們都歸結爲告訴shell將空間作爲一個參數的一部分,而不是分離參數之間。上述所有腳本的$ 1設置爲a b c d,而$ 2,$ 3等未設置。

然而,當展開$ 1ݙࡒ引號,像這樣:

echo_arguments $1 

外殼擴展$ 1 然後resplits它處理的空間作爲參數之間的分隔符。因此,雖然my_spcript.sh將a b c d作爲單個參數獲取,但echo_arguments會將每個字母作爲單獨的參數獲取。通常情況下,解決這個問題最好的辦法是把雙引號$ 1防止它被重新分割(和防止其他一些可能不受歡迎的雜散解析以及):

echo_arguments "$1" 

一般來說,每當你用一個變量代替變量,你應該用雙引號把它包裹起來,以防止你看到的那種問題。有些情況下你想要的附加解析,所以你不需要雙引號;但除非您有特別的理由希望shell執行額外的解析,否則請使用雙引號來保存頭痛。

爲了您的具體的例子,另一種方式來「解決」,這將是使echo_arguments呼應所有它的參數,而不僅僅是第一:

echo_arguments() { 
    echo "[email protected]" 
} 

注意"[email protected]"擴展到所有當前的腳本/函數的參數,每一個都被視爲傳遞給它們的命令/函數的一個單獨的參數(基本上,它們完整地傳遞)。

1

用引號括住參數將允許參數中的空格 - 即./my_spcript.sh 'a b c d'。你需要做同樣的腳本中:正如其他人,$ @($和*)提供其他的方式來指所有的命令行參數爲一組提到

# my_script.sh 
echo_arguments() { 
    echo $1 
} 
echo_arguments "$1" 

。例如,請參閱http://tldp.org/LDP/abs/html/internalvariables.html瞭解Bash的詳細信息。

+0

我想這就像 ./my_script.sh回聲喜 和我的輸出只是「回聲」 $ 1 –

+0

@NathanPk在這個例子中,你沒有使用引號。他告訴你在調用腳本時在你的論點中加引號。 –

+0

對不起,它有一個錯字錯誤。我用我上面的例子引號 –

0

我不知道它是否適合,但你可以嘗試採用「變參」在bash:

echo_arguments() { 
echo ${@:1:4} 
} 

echo_arguments ${@:1:4} 

這將展開第4個參數。

0

如果您希望這些成爲一個參數的腳本,然後把它們放入引號(單人或雙人):

./my_script.sh 'a b c d' 

相反,如果你希望他們被解析爲單獨的參數,但是您想要將所有參數傳遞給腳本中的函數,則可以使用[email protected]一次引用它們中的所有參數。

echo_arguments() { 
    echo "[email protected]" 
} 
echo_arguments "[email protected]"