日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 信号传递函数,Linux Shell之七 函数应用

發(fā)布時間:2025/4/16 linux 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux 信号传递函数,Linux Shell之七 函数应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。