原文:https://blog.csdn.net/xyw_blog/article/details/17688145
-----------
由於Bash的易於編程等特點,是眾多Shell中比較常用的一種。
Bash命令行參數
在使用wget的時候,我喜歡加上一個-c的參數,這樣可以讓wget啟用斷點續傳功能。這里的-c就是一個命令行參數。
在寫c語言的時候,我們使用字符串數組存儲命令行參數,像我們所熟悉的argv[]。當然我們也需要命令行參數的個數,這存儲在名為argc的整型變量中。argc和argv是約定俗成的名稱,當然你可以使用自己的名稱作為main函數的形參。
在編寫Bash腳本的時候,也同樣可以使用命令行參數。在Bash函數中也可以使用參數,特殊的是,Bash中的函數是沒有參數列表的,例如
function foo
這樣便完成了一個函數頭的定義,但是沒有任何的形參名稱,這是由於Bash中特殊的參數傳遞方法所致。
這里需要說明的是,在Bash編程中命令行參數和函數的形參都采用統一的規則。
Bash的函數規則
在Bash中,所有變量在賦值是賦值號左側直接寫變量名。而在引用變量的值時,變量名的左側需要加上$符號。寫過PHP腳本可能對此深有印象,不過PHP是賦值和引用都要寫。
Bash的參數是按照位置傳遞的,而且自動給出變量名稱,例如$1就表示第一個參數,當然$2就是第二個參數,參數之間用空格區分。這樣你可以順序寫到$n(n表示一個正整數),有幾個參數都可以按照順序引用。
$0表示當前運行命令的名稱,這個其實是特殊的參數,但是往往很少用到。
如果你想得到參數的個數,它保存在一個特殊名稱的變量里,叫做$#。
$*和$@表示所有的參數,具體區別和其他一些特殊參數請見這里。
注:后面我們會用到一個$?參數,這表示上一條獨立命令運行的結果。我們才c語言寫程序的時候,常常以return 0作為程序正常退出的標志,這個0就被返回給Bash,而$?可以引用到上一個程序運行的結果。還記得Bash函數的參數和命令行參數是相同的嗎?如果剛剛執行完一個Bash函數,$?里就保存着這個函數的運行結果,即return的值。
Bash的返回值
通常情況下Bash的函數是很少需要返回值的,但是有的時候需要,比如確定一個函數是否被成功執行,然后確定下一步的動作。這樣的邏輯必須得到Bash函數的返回值,用以表示函數執行的狀態。
在變寫腳本時就遇到了這種需要,經過Google,獲得兩篇比較好的帖子:
英文:http://mail.linux.ie/pipermail/ilug/2008-March/097416.html (是一個郵件列表的郵件)
中文:http://blog.morebits.org/?p=83 (這里是一篇博文)
里面總結了5中Bash返回值的HACK方法:
1. 使用return返回(適用於數值)
myfun() {
return $(( 5 + 1 ));
}
myfun
RESULTS=$?
echo $RESULTS
這里的$?保存着函數運行的結果。
2. 使用echo(用echo返回結果,同樣適用於數值)
myfun() {
echo $(( 5 + 1 ));
}
RESULTS=$(myfun)
echo $RESULTS
3. 近似全局變量的用法
myfun() {
foo=$(( 5 + 1 ));
}
myfun
RESULTS=$foo
echo $RESULTS
這里的$foo充當了全局變量的角色,將返回值從函數內帶到函數外。
4. 使用地址傳遞參數
myfun() {
eval $1="\$(( 5 + 1 ))";
}
myfun RESULTS
echo $RESULTS
這里使用了一個函數參數$1帶出返回值,這個方法非常類似與C++中的引用和C中的參數傳址。從一個側面反應了Bash在參數傳遞的時候應該都是傳遞的內存地址。
5. 使用地址傳遞(適用於數值)
myfun() {
let $1=5+1;
}
myfun RESULTS
echo $RESULTS
當然,以上這些方法可以單獨使用,也可以結合使用。比如可以將傳址和使用echo的方法結合起來:
function myfunc()
{
local __resultvar=$1
local myresult='some value'
if [[ "$__resultvar" ]]; then
eval $__resultvar="'$myresult'"
else
echo "$myresult"
fi
}
myfunc result
echo $result
result2=$(myfunc)
echo $result2
這樣使用可以提供最大的靈活性。