您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“如何理解Shell中的函數(shù)、函數(shù)定義、作用域”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解Shell中的函數(shù)、函數(shù)定義、作用域”吧!
一、Shell中函數(shù)的定義
為了方便程序和管理和模塊化并減少代碼的重復(fù),函數(shù)的確是一個(gè)好東西。而Shell中函數(shù)的定義有兩種方法,如下:
代碼如下:
function fname()
{
statements;
}
或
代碼如下:
fname()
{
statements;
}
注意,()內(nèi)是沒(méi)有參數(shù)的,它并不像C語(yǔ)言那樣,在()里可以有參數(shù)。
那大家可能就郁悶了,函數(shù)調(diào)用或多或少總是會(huì)需要一些參數(shù),那么這些參數(shù)要怎么傳遞進(jìn)來(lái)呢?其實(shí)參數(shù)傳遞方式為:fname;(不需要傳遞參數(shù))或fname agr1 arg2(需要傳遞兩個(gè)參數(shù));
二、自定義函數(shù)的例子
不知道大家的情況如何,反正一開(kāi)始我就覺(jué)得很別扭,因?yàn)樵贑語(yǔ)言中,例如我定義一個(gè)函數(shù)int cmp(int a, int b),那么我就會(huì)在函數(shù)中使用到函數(shù)頭中聲明的變量a和b,而在Shell中卻沒(méi)有定義參數(shù),那我的函數(shù)又需要用到這兩個(gè)參數(shù),怎么辦好呢?下面就用一個(gè)例子來(lái)說(shuō)明好了。
代碼如下:
#! /bin/bash
# Filename:LoopPrint.sh
function LoopPrint()
{
count=0;
while [ $count -lt $1 ];
do
echo $count;
let ++count;
sleep 1;
done
return 0;
}
read -p "Please input the times of print you want: " n;
LoopPrint $n;
先來(lái)說(shuō)說(shuō)這個(gè)程序的功能吧,就是輸入一個(gè)數(shù)字n,然后從0開(kāi)始每隔1秒輸入一個(gè)數(shù)字,直到輸出n-1為止。首先,程序會(huì)要求你輸入一個(gè)數(shù)學(xué),然后調(diào)用函數(shù)來(lái)進(jìn)行輸出的功能。
注意注釋1的那一句,里面有一個(gè)變量$1,大家應(yīng)該還記得調(diào)用函數(shù)時(shí)參數(shù)的傳遞方式,即fname agr1 arg2,這里的$1就是表示第一個(gè)參數(shù),依此類推,$2就是第二個(gè)參數(shù),$3就是第3個(gè)參數(shù),$n就是表示第n個(gè)參數(shù)。
所以$1就是變量n的值。這樣說(shuō)大家懂了吧!
補(bǔ)充一下,就是:
$0:是腳本本身的名字;
$#:是傳給腳本的參數(shù)個(gè)數(shù);
$@:是傳給腳本的所有參數(shù)的列表,即被擴(kuò)展為"$1" "$2" "$3"等;
$*:是以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,參數(shù)可超過(guò)9個(gè),即被擴(kuò)展成"$1c$2c$3",其中c是IFS的第一個(gè)字符;
$$:是腳本運(yùn)行的當(dāng)前進(jìn)程ID號(hào);
$?:是顯示最后命令的退出狀態(tài),0表示沒(méi)有錯(cuò)誤,其他表示有錯(cuò)誤;
特別注意,傳遞參數(shù)時(shí),(這個(gè)例子中)一定要寫(xiě)成LoopPrint $n;而不能寫(xiě)成LoopPrint n。為什么?例如你輸入的是20,則n的值($n)為20,前者表示的是把n的值,即20傳遞給函數(shù)LoopPrint,而后者則表示把字符n傳遞給函數(shù)LoopPrint。這點(diǎn)與在靜態(tài)語(yǔ)言中的函數(shù)參數(shù)傳遞是很不同的,因?yàn)樵赟hell中變量的使用并不需要先定義,所以要使用變量,讓Shell知道它是一個(gè)變量,并要傳遞它的值時(shí),就是用$n,而不能直接用n,否則只把n當(dāng)作一個(gè)字符來(lái)處理,而不是一個(gè)變量。
三、作用域問(wèn)題
函數(shù)的作用域與C/C++語(yǔ)言中的作用約束是一樣的,函數(shù)的定義一定要出現(xiàn)在函數(shù)的調(diào)用語(yǔ)句之前,但是有一點(diǎn)跟C/C++中不一樣的就是變量的作用域問(wèn)題,經(jīng)過(guò)本人的試驗(yàn),在注釋1的語(yǔ)句改為while [ $count -lt $n ];也是可行的,即函數(shù)可以使用本文件中出現(xiàn)的任何變量,但是本人還是建議使用上面例子中的方法,即while [ $count -lt $1 ],并且不要隨意使用函數(shù)中的變量之外的變量,因?yàn)槟悴⒉灰欢ㄖ滥阏{(diào)用函數(shù)時(shí)函數(shù)外有什么變量存在也不知道它的值是什么,也不能保證別人在使用你的函數(shù)時(shí)會(huì)傳遞你在函數(shù)中使用到的變量名,如這里的n,別人在使用時(shí)可能傳遞的就是他自己定義的變量,如Count等。
到此,相信大家對(duì)“如何理解Shell中的函數(shù)、函數(shù)定義、作用域”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。