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