說起函式呼叫,相信大家也不會陌生,然而對於初學shell的我來說,shell中函式呼叫方式卻有點讓我不太習慣,自己也走了不少的彎路,因為傳遞引數時出了乙個很「自然」的錯誤,也讓我吃了不少的苦頭,所以總結一下shell中函式的呼叫方法。
一、shell中函式的定義
為了方便程式和管理和模組化並減少**的重複,函式的確是乙個好東西。而shell中函式的定義有兩種方法,如下:
function fname()
或fname()
注意,()內是沒有引數的,它並不像c語言那樣,在()裡可以有引數。
那大家可能就鬱悶了,函式呼叫或多或少總是會需要一些引數,那麼這些引數要怎麼傳遞進來呢?其實引數傳遞方式為:fname;(不需要傳遞引數)或fname agr1 arg2(需要傳遞兩個引數);
二、自定義函式的例子
不知道大家的情況如何,反正一開始我就覺得很彆扭,因為在c語言中,例如我定義乙個函式int cmp(int a, int b),那麼我就會在函式中使用到函式頭中宣告的變數a和b,而在shell中卻沒有定義引數,那我的函式又需要用到這兩個引數,怎麼辦好呢?下面就用乙個例子來說明好了。
[plain]view plain
copy
print?
#! /bin/bash
# filename:loopprint.sh
function loopprint()
read -p "please input the times of print you want: " n;
loopprint $n;
先來說說這個程式的功能吧,就是輸入乙個數字n,然後從0開始每隔1秒輸入乙個數字,直到輸出n-1為止。首先,程式會要求你輸入乙個數學,然後呼叫函式來進行輸出的功能。
注意注釋1的那一句,裡面有乙個變數$1,大家應該還記得呼叫函式時引數的傳遞方式,即fname agr1 arg2,這裡的$1就是表示第乙個引數,依此類推,$2就是第二個引數,$3就是第3個引數,$n就是表示第n個引數。
所以$1就是變數n的值。這樣說大家懂了吧!
補充一下,就是:
$0:是指令碼本身的名字;
$#:是傳給指令碼的引數個數;
$@:是傳給指令碼的所有引數的列表,即被擴充套件為"$1" "$2" "$3"等;
$*:是以乙個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,引數可超過9個,即被擴充套件成"$1c$2c$3",其中c是ifs的第乙個字元;
$$:是指令碼執行的當前程序id號;
$?:是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤;
特別注意,傳遞引數時,(這個例子中)一定要寫成loopprint $n;而不能寫成loopprint n。為什麼?例如你輸入的是20,則n的值($n)為20,前者表示的是把n的值,即20傳遞給函式loopprint,而後者則表示把字元n傳遞給函式loopprint。這點與在靜態語言中的函式引數傳遞是很不同的,因為在shell中變數的使用並不需要先定義,所以要使用變數,讓shell知道它是乙個變數,並要傳遞它的值時,就是用$n,而不能直接用n,否則只把n當作乙個字元來處理,而不是乙個變數。
三、作用域問題
函式的作用域與c/c++語言中的作用約束是一樣的,函式的定義一定要出現在函式的呼叫語句之前,但是有一點跟c/c++中不一樣的就是變數的作用域問題,經過本人的試驗,在注釋1的語句改為while [ $count -lt $
n ];也是可行的,即函式可以使用本檔案中出現的任何變數,但是本人還是建議使用上面例子中的方法,即while [ $count -lt $1 ],並且不要隨意使用函式中的變數之外的變數,因為你並不一定知道你呼叫函式時函式外有什麼變數存在也不知道它的值是什麼,也不能保證別人在使用你的函式時會傳遞你在函式中使用到的變數名,如這裡的n,別人在使用時可能傳遞的就是他自己定義的變數,如count等。
linux shell指令碼之if判斷
無論什麼程式語言都離不開條件判斷。shell也不例外。if list then do something here elif list then do another thing here else do something else here fi ex1 bin sh system uname ...
linux shell指令碼之判斷
先寫一些基本語法 1 字串判斷 str1 str2 當兩個串有相同內容 長度時為真 str1 str2 當串str1和str2不等時為真 n str1 當串的長度大於0時為真 串非空 z str1 當串的長度為0時為真 空串 str1 當串str1為非空時為真 2 數字的判斷 int1 eq int...
Linux shell之陣列使用
1.陣列定義 a 1 2 3 4 5 2.陣列引用 apuser wenyangubtpc echo 1 2 3 4 5 3.陣列長度 apuser wenyangubtpc echo 5 4.列印陣列 echo apuser wenyangubtpc echo 1 2 3 4 5 5.陣列元素引用...