【轉】Bash函數的參數和返回值


 

原文: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

這樣使用可以提供最大的靈活性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM