鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)三十一天---函數(shù)問題

案例一:

 #!/bin/bash  
hello () {  
        echo "hahahah"  
}  
hello  

執(zhí)行函數(shù),結(jié)果為:hahaha

案例二:

 #!/bin/bash  
funWithReturn()  
{  
    echo "the function is to get the sum of two number"  
    read -p "input first number" num1  
    read -p "input second number" num2  
    echo "the two number are $num1 and $num2 !"  
    return $(( $num1+$num2 ))
}   

funWithReturn  
ret=$?  
echo "sum = $ret"  

執(zhí)行函數(shù),得到兩個(gè)數(shù)的和.

案例三:

 #!/bin/bash  
number_one() {  
        echo "number_one"  
        number_two  
}  

number_two()  
{  
        echo "number_two"  
}  
number_one  

執(zhí)行命令:[root@localhost tmp]# sh function2.sh
輸出結(jié)果:
number_one
number_two

分析:定義 shell 函數(shù)的語法為

[funciton] funname [()]  
{  
action  
[ return int ]  
}  

說明:

  1. 可以帶 function fun()定義,也可以直接 fun()定義,不帶任何參數(shù)(關(guān)鍵字 function 可以省略).
  2. 函數(shù)返回,可以顯示的加:return 返回,如果不加,將以最后一條命令的運(yùn)行結(jié)果作為返回值.

Shell 函數(shù)類似于 Shell 腳本,里面存放了一系列的指令,不過 Shell 的函數(shù)存在于內(nèi)存,而不是硬盤文件,所以速度很快,另外,Shell 還能對(duì)函數(shù)進(jìn)行預(yù)處理,所以函數(shù)的啟動(dòng)比腳本更快。

語句部分可以是任意的 Shell 命令,也可以調(diào)用其他的函數(shù)。
如果在函數(shù)中使用 exi t命令,可以退出整個(gè)腳本,通常情況,函數(shù)結(jié)束之后會(huì)返回調(diào)用函數(shù)的部分繼續(xù)執(zhí)行。
可以使用 break 語句來中斷函數(shù)的執(zhí)行。
declare –f 可以顯示定義的函數(shù)清單
declare –F可以只顯示定義的函數(shù)名
unset –f 可以從 Shell 內(nèi)存中刪除函數(shù)
export –f 將函數(shù)輸出給 Shell
另外,函數(shù)的定義可以放到.bash_profile 文件中,也可以放到使用函數(shù)的腳本中,還可以直接放到命令行中,還可以使用內(nèi)部的 unset 命令刪除函數(shù)。一旦用戶注銷,Shell 將不再保持這些函數(shù)。

補(bǔ)充一下,就是:
$0:是腳本本身的名字;
$#:是傳給腳本的參數(shù)個(gè)數(shù);
$@:是傳給腳本的所有參數(shù)的列表,即被擴(kuò)展為"$1" "$2" "$3"等;
$*:是以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,參數(shù)可超過 9 個(gè),即被擴(kuò)展成"$1c$2c$3",其中 c 是 IFS 的第一個(gè)字符;
$$:是腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào);
$?:是顯示最后命令的退出狀態(tài),0 表示沒有錯(cuò)誤,其他表示有錯(cuò)誤;

舉例說:
腳本名稱叫 test.sh 入?yún)⑷齻€(gè): 1 2 3
運(yùn)行 test.sh 1 2 3后
$*為"1 2 3"(一起被引號(hào)包住)
$@為"1" "2" "3"(分別被包?。?br /> $#為 3(參數(shù)數(shù)量)

其中 exit 是用來結(jié)束一個(gè)程序的執(zhí)行的,而 return 只是用來從一個(gè)函數(shù)中返回。
exit(0)表示正常退出執(zhí)行程序,如果加其它的數(shù)值:1,2,....可以表示由于不同的錯(cuò)誤原因而退出 。
那么,1,2,3 怎么對(duì)應(yīng)不同的原因? --你自己想讓它是什么意思,它就是什么意思.
但一般都有常用的、通用的含義:比如 0 一般都表示正常返回、退出。
因此,在 main 函數(shù)中 exit(0)等價(jià)于 return 0。

全局變量
這種類似與 C 語言中的全局變量(或環(huán)境變量)
案例:

 #!/bin/bash  
g_var=  
function mytest()  
{  
        echo "mytest"  
        echo " args $1"  
        g_var=$1  

        return 0  
}  
mytest 1  
echo "return $?"  

echo  
echo "g_var=$g_var"  

分析:主要是 echo "return $?"輸出時(shí) 0 不好理解,這個(gè)是說上一行的 mytest 這個(gè)函數(shù)執(zhí)行成功了,所以值為 0,但是在這個(gè)函數(shù)的內(nèi)部給全局變量重新賦值.所以結(jié)果為:

mytest  
 args 1  
return 0  

g_var=1  

函數(shù)沒有提供局部變量.因此所有的函數(shù)都與父腳本共享變量;即,你必須小心留意不要修改父腳本里不期望改變的東西,例如:path.不過這也表示其他狀態(tài)是共享的,例如當(dāng)前木與捕捉信號(hào).