linux 信号传递函数,Linux Shell之七 函数应用
函數(shù)是什么?
函數(shù)是一些命令的集合,使用一個名稱做代表,稱為函數(shù)名稱。函數(shù)名稱的命名規(guī)則和變量相同。
一旦函數(shù)定義好了,執(zhí)行這個名稱,就好象執(zhí)行Bash的命令一樣,稱為調(diào)用函數(shù)。實際上,Bash調(diào)用函數(shù)時,會執(zhí)行函數(shù)里的命令區(qū)域,執(zhí)行
完畢,Bash會回到調(diào)用函數(shù)的下一行繼續(xù)執(zhí)行。
函數(shù)的最大作用是可以讓程序模塊化。如果Script程序中,需要重復(fù)執(zhí)行某一命令區(qū)域,那么就應(yīng)當使用函數(shù)代表這個區(qū)域,一方面可使程序精簡,一方面程序代碼頁比較容易維護。
一、函數(shù)的用法
1、函數(shù)的語法
語法1:
function 函數(shù)名稱()
{
命令區(qū)域
}
函數(shù)名稱與()之間可以直接相連,也可用空格隔開。
語法2:
函數(shù)名稱()
{
命令區(qū)域
}
關(guān)鍵詞function可省略
語法3:
function 函數(shù)名稱
{
命令區(qū)域
}
如果使用關(guān)鍵詞function,函數(shù)名稱后的()也可省略
例子:
#!/bin/bash
getline () ? ? ? ? ?#定義函數(shù)getline,用來定義文件行數(shù)
{
local i=0 ? ? ? ? ?#i代表已計算的行數(shù),先歸0。
#local用來設(shè)定變量i是getline函數(shù)中專有的變量,不影響script其它地方也叫i的函數(shù)
while read line
do ? ? ? ? ? ? ? ? #使用while循環(huán),自變量值$file指定文件讀取每一行
let ++i ? ? ? ? ? #每讀一行 變量i值+1
done < $file ? ? ? #使用轉(zhuǎn)向輸入,讓read能由$file讀取數(shù)據(jù)
echo "$file文件共有$i行" ? #顯示總行
}
file=$1 ? ? ? ? ? ? #由命令行第一個參數(shù),取得要計算行數(shù)的文件名。
getline ? ? ? ? ? ?#調(diào)用getline函數(shù)
echo "getline 執(zhí)行完畢" ? #getline執(zhí)行完后,回到這里繼續(xù)執(zhí)行下一指令。
#./script passwd
passwd文件共有36行
getline執(zhí)行完畢
在調(diào)用函數(shù)之前一定要先定義該函數(shù)。
unset -f 函數(shù) ?取消函數(shù)
2、函數(shù)的結(jié)束狀態(tài)
執(zhí)行函數(shù)時,函數(shù)中最后一個命令的傳回值代表函數(shù)的結(jié)束狀態(tài)。執(zhí)行函數(shù)如果遇到return命令,就立即結(jié)束,回到調(diào)用函數(shù)的下一個命令,此時函數(shù)的傳回值為0
#!/bin/bash
getline ()
{
local i=0
while read line
do
let ++i
if (($i > 10));then ? ? ? ?#判斷是否超過10行
echo "$file文件大于10行,不再繼續(xù)"
return ? ? ? ? ? ? ? ? ? #遇到return命令,立即回到echo$?所在行
#默認傳回值為0,也可指定不同的傳回值,直接在return空格加數(shù)字即可
fi
done < $file
echo "$file文件共有$i行"
}
file=$1
getline
echo $?
echo "getline 執(zhí)行完畢"
可以根據(jù)$?(return 接的數(shù)字n )的值執(zhí)行想要的命令,如上 ?if[ $? -eq 3 ];then
echo "行數(shù)過多,放棄讀取"
else
echo 'getline執(zhí)行完畢'
fi
二、函數(shù)與變量的作用范圍。
1、函數(shù)的作用范圍
函數(shù)僅在定義的shell環(huán)境中有效,Bash執(zhí)行函數(shù)時,并不會另外再開啟一個子shell。
如果要傳遞函數(shù)給shell環(huán)境使用,可以用內(nèi)置命令export ? -f函數(shù)名稱,這樣此函數(shù)就變成了環(huán)境變量的一部分(函數(shù)型),可供子shell的script調(diào)用。
2、變量的作用范圍
如果沒有特別的設(shè)定變量的屬性,那么在Script中自定義的變量稱為全局變量(對此腳本而言)。作用范圍在整個Script文件中皆有效。
#!/bin/bash
getline ()
{
local i=0 ? ? ? ? ? ? ? #這就定義了變量i只在函數(shù)getline中有效,變量i和函數(shù)外其它叫i的變量完全不一樣。
while read line
do
....
三、位置參數(shù)
1、命令行的位置參數(shù)
$0 ?表示腳本名 $1 表示第一個參數(shù) $2表示第2給參數(shù) $(10)表示第10個參數(shù)
$* ? ?代表所有的位置參數(shù),看為一個字符串。1.sh a x y則$*為"a x y"
$@ ? ?代表所有以空白隔開的參數(shù),各位置串行。 ? ?1.ah a x y則$@為"a"、"x"、"y"
$# ? ?位置參數(shù)的個數(shù),1.ah a x y則$#的值為3
#!/bin/bash
if [ $# -ne 2 ];then ? ? ? ? ? ? ? ?必須鍵入2個參數(shù),否則錯誤退出
echo "使用方法:./$0 參數(shù)1 參數(shù)2"
exit 1
fi
2、移動位置參數(shù)
Bash的內(nèi)置命令shift可以往前移動位置參數(shù)的值,語法如下:
shift n
n為正整數(shù),代表往前移動的次數(shù)。n可以省略不寫代表移動一次。執(zhí)行 shift n,$(n+1)的值會放入$1
以執(zhí)行shift命令來說(不指定次數(shù)),$2的值放入$1,$3的值放入$2,$4的值放入$3,,,如果一直執(zhí)行shift(次數(shù)>=n),會把所有的位置參數(shù)清空
shift 一次清除1個(從$1開始) ,shift 2 一次清除2個#!/bin/bash
echo?"\$@的初始值為$@"
while?shift
do
[?-n?"$1"?]?&&?echo?"shift?1次,\$@的變化:$@"
done
執(zhí)行結(jié)果:
[root@centos?tmp]#?bash?1.sh??a?b?c?d?e
$@的初始值為a?b?c?d?e
shift?1次,$@的變化:b?c?d?e
shift?1次,$@的變化:c?d?e
shift?1次,$@的變化:d?e
shift?1次,$@的變化:e
3、指定位置參數(shù)的值
指定位置參數(shù)的值稱為重置(reset),用Bash命令set#!/bin/bash
declare?-i?i=0
set?10?20?30?40?50
for?p?in?$@
do
((i++))
echo?"?第?$i?個位置參數(shù)?$$i?=?$p"?????#$$目前bash?shell的進程編號
done
[root@centos?tmp]#?bash?2.sh
第?1?個位置參數(shù)?3547i?=?10
第?2?個位置參數(shù)?3547i?=?20
第?3?個位置參數(shù)?3547i?=?30
第?4?個位置參數(shù)?3547i?=?40
第?5?個位置參數(shù)?3547i?=?50
一旦用set重置位置參數(shù),其原有的值就會消失,改以新值取代。(無論輸入幾個參數(shù),set設(shè)置幾個就是幾個)
如果要一次重置所有參數(shù),使其值為空,可執(zhí)行 set --
4、取用命令行的選項和參數(shù)
在設(shè)計腳本的時候,往往需要由命令行中取得用戶提供的選項和參數(shù),根據(jù)不同的選項,腳本有不同的處理方式和執(zhí)行結(jié)果。選項的使用方式可以
是單一選項,也可以在選項后方加上準備作用的參數(shù),而且,選項出現(xiàn)的次序并沒有嚴格的要求。
如以下例子:
./script -u jacken -a -h
或改用以下形式
./script -a -u jacken -h
如果要想取得這些選項和參數(shù),使用前述的位置參數(shù)也是可以的,不過拿到位置參數(shù)后,必須再做許多條件判斷才行,因為選項可能以不同的次序
出現(xiàn)在命令行不同的位置,情況十分復(fù)雜。解決這樣的問題,可改用Bash提供的內(nèi)置命令getopts。
getopts語法如下:
getopts 選項行 選項變量
其中選項行,是由各選項的單一字符組成,如前述例子中用來3個選項,可組合成“u:ah”
如果某一個選項字符后方,接上":" 則表示該選項需要提供一個參數(shù),如這里的u后面有":"
如果執(zhí)行腳本的時候,選項u后方?jīng)]有提供額外的參數(shù),那么Bash就會顯示“option requires an argument --u”的錯誤信息。
如果不想出現(xiàn)這種錯誤信息,可在選項行最前面加上":" 如 ":u:ah" 像這樣子,u后邊沒有參數(shù)也不會報錯了。
至于選項變量的作用是:
getopts由命令行取得選項,把它放入選項變量中,如果該選項需要額外的參數(shù),參數(shù)值會放入OPTARG這個變量中。
例子:[root@Shell?~]#?./opt.sh?-a
提供了選項a
[root@Shell?~]#?./opt.sh?-h
提供了選項h
[root@Shell?~]#?./opt.sh?-a?-h
提供了選項a
提供了選項h
[root@Shell?~]#?./opt.sh?-u
./opt.sh:?option?requires?an?argument?--?u
[root@Shell?~]#?./opt.sh?-u?hello
提供了選項-u和參數(shù):hello
[root@Shell?~]#?cat?opt.sh
#!/bin/bash
#
while?getopts?u:ah?opt
do
case?$opt?in
u)
echo?"提供了選項-u和參數(shù):$OPTARG";;
a)
echo?"提供了選項a";;
h)
echo?"提供了選項h";;
*)
;;
esac
done
[root@Shell?~]#
四、建立函數(shù)庫
如果某些函數(shù)經(jīng)常出現(xiàn)在設(shè)計的script中,可以考慮把這些函數(shù)抽出來,集中存成一個文件,但這個文件稱為函數(shù)庫。
在命名函數(shù)時,函數(shù)名稱第一個字符使用_(下劃線),通常這就代表系統(tǒng)用的函數(shù)或變量名稱。
在/tmp下建立函數(shù)庫mylib1.sh
_getip()
{
local tmp r ip ? ? ? ? ? ? ? ? ? ? ? ? ? #函數(shù)內(nèi)部使用的變量設(shè)為私有
[ -z "$1" ] && return ? ? ? ? ? ? ? ? ? ? #如果位置參數(shù)$1為空,直接退出
shuzu=() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #建立數(shù)組變量shuzu,作為傳回ip字符串用,初始值設(shè)為空數(shù)組
tmp=$(ifconfig $1 | grep 'inet addr')
r=${tmp/inet addr:/}
ip=${r/Bcast*/}
shuzu=($ip) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#將找到的ip設(shè)為第一個數(shù)組元素,作為函數(shù)處理結(jié)果的傳回值
}
調(diào)用函數(shù)數(shù)據(jù)庫的語法,. /路徑/函數(shù)數(shù)據(jù)庫 ? .也用source來表示
#!/bin/bash
MYLIB_DIR="/tmp" ? ? ? ? ? ? ? ? ? ? ? ? ? #設(shè)置函數(shù)庫默認路徑
if [ ! -d "MYLIB_DIR" ];then
MYLIB_DIR="." ? ? ? ? ? ? ? ? ? ? ? ? ? #如果默認路徑不存在就設(shè)為當前目錄
fi
. $MYLIB_DIR/mylib1.sh ? ? ? ? ? ? ? ? ? ? #調(diào)用函數(shù)庫mylib1.sh
_getip eth0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#執(zhí)行_getip傳入的參數(shù)是網(wǎng)絡(luò)接口的名稱eth0
ip=${shuzu[0]} ? ? ? ? ? ? ? ? ? ? ? ? ? ? #取出代表函數(shù)執(zhí)行結(jié)果的數(shù)組變量shuzu的第一個元素,設(shè)值給變量ip
if [ -n "$ip" ];then ? ? ? ? ? ? ? ? ? ? ? #判斷$ip是否為空,-z 為空 -n不為空
echo "主機ip是:$ip"
else
echo "找不到IP"
fi
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的linux 信号传递函数,Linux Shell之七 函数应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 定制linux版本,Instalinux
- 下一篇: 嵌入式linux内核oops,Linux