linux shell中的函數和大多數編程語言中的函數同樣 將類似的任務或者代碼封裝到函數中,供其餘地方調用linux
語法格式nginx
如何調用函數shell
shell終端中定義函數編程
[root@master day3]# test() > { > echo "test function"; > }
練習;時刻監聽 nginx的進程,失敗重啓bash
nginx_daemon.sh編程語言
#!/bin/bash # # 獲取腳本子進程的pid,若是腳本名稱中帶nginx,也會當成nginx進程 this_pid=$$ while true do ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then echo "Nginx is running well" sleep 5 else systemctl start nginx echo "Nginx is down,Start it..." fi done
啓動腳本ide
sh nginx_daemon.sh
一系統守護進程運行函數
nohup sh nginx_daemon.sh &
查看日誌 測試
tail -f nohup.out
一些高級語言傳遞參數this
高級語言函數調用
shell 中函數傳參
shell 中函數調用
簡單小示例
[root@master day3]# function greeeting > { > echo "hello $1" > }
向函數傳遞參數: 函數傳參和給腳本傳參相似,都是使用$1 $2 $3 $4 $5 $6 $7這種方式
例子1:
需求描述:寫一個腳本,該腳本能夠實現計算器的功能,能夠進行+-*/四種運算。
calucate.sh
#!/bin/bash # function calcu { case $2 in +) echo "`expr $1 + $3`" ;; -) echo "`expr $1 - $3`" ;; '\*') echo "`expr $1 \* $3`" ;; /) echo "`expr $1 / $3`" ;; esac } calcu $1 $2 $3
返回值的方式
使用 return 返回值
使用 echo 返回值
案例1 判斷nginx進程是否存在
函數使用return返回值,一般只是用來供其餘地方調用獲取狀態,所以一般僅返回0或1;0表示成功,1表示失敗
nginx.sh
#!/bin/bash # this_pid=$$ function is_nginx_running { ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null if [ $? -eq 0 ];then return 0 else return 1 fi } is_nginx_running && echo "nginx is running" || echo "nginx is stopped"
執行腳本
sh nginx.sh
查看腳本進程的執行過程
sh -x nginx.sh
案例2 獲取系統中的用戶
使用echo返回值 使用echo能夠返回任何字符串結果 一般用於返回數據,好比一個字符串值或者列表值
get_sys_user.sh
#!/bin/bash # # 獲取系統全部的用戶名 function get_users { users=`cat /etc/passwd | cut -d: -f1` echo $users } # 定義一個變量將獲取用戶列表賦值給這個變量 user_list=`get_users` index=1 for u in $user_list do echo "the $index user is : $u" index=$(($index+1)) done
執行腳本
sh get_sys_user.sh
全局變量
局部變量
var.sh
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2
調用test函數後,$var2就變成了全局變量
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2 test # 調用test函數後,$var2就變成了全局變量 echo $var1 echo $var2
在函數中也能夠調用全局變量
#!/bin/bash # var1="Hello world" function test { var2=87 } echo $var1 echo $var2 test echo $var1 echo $var2 function test1 { echo $var2 } test1
若是函數中聲明瞭局部變量,當函數執行完成後局部變量就會被銷燬
#!/bin/bash # var1="Hello world" function test { local var2=87 # 局部變量,只在函數內部生效,生命週期只在函數內部 } test echo $var1 echo $var2
爲何要定義函數庫
函數庫示例:
定義一個函數庫,該函數庫實現如下幾個函數:
cat /lib/base_function
function add { echo "`expr $1 + $2`" } function reduce { echo "`expr $1 - $2`" } function multiple { echo "`expr $1 \* $2`" } function divide { echo "`expr $1 / $2`" } function sys_load { echo "Memory info" echo free -m echo echo "Disk Usage" echo df -h echo }
測試庫函數
. /lib/base_function sys_load
calculate.sh
#!/bin/bash # # 引入庫函數,寫絕對路徑避免出錯 . /lib/base_function add 12 23 reduce 90 30 multiple 12 12 divide 12 2
庫函數經驗之談: