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

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

函數(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ù)的語(yǔ)法為

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

說(shuō)明:

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

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

語(yǔ)句部分可以是任意的 Shell 命令,也可以調(diào)用其他的函數(shù)。如果在函數(shù)中使用 exit 命令,可以退出整個(gè)腳本,通常情況,函數(shù)結(jié)束之后會(huì)返回調(diào)用函數(shù)的部分繼續(xù)執(zhí)行??梢允褂?break 語(yǔ)句來(lái)中斷函數(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ù)。一旦用戶(hù)注銷(xiāo),Shell 將不再保持這些函數(shù)。

補(bǔ)充一下,就是:

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

舉例說(shuō):

腳本名稱(chēng)叫 test.sh 入?yún)⑷齻€(gè): 1 2 3

運(yùn)行 test.sh 1 2 3

  • $* 為 "1 2 3"(一起被引號(hào)包住)
  • $@為 "1" "2" "3"(分別被包?。?/li>
  • $#為 3(參數(shù)數(shù)量)

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

全局變量

這種類(lèi)似與 C 語(yǔ)言中的全局變量 (或環(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è)是說(shuō)上一行的 mytest 這個(gè)函數(shù)執(zhí)行成功了,所以值為 0,但是在這個(gè)函數(shù)的內(nèi)部給全局變量重新賦值。所以結(jié)果為:

mytest  
args 1  
return 0  
g_var=1  

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