函數介紹
linux shell中的函數和大多數編程語言中的函數一樣 將相似的任務或者代碼封裝到函數中,供其他地方調用
語法格式


如何調用函數

shell終端中定義函數
[root@master day3]# test()
> {
> echo "test function";
> }

練習;時刻監聽 nginx的進程,失敗重啟
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
啟動腳本
sh nginx_daemon.sh

一系統守護進程運行
nohup sh nginx_daemon.sh &
查看日志
tail -f nohup.out

向函數傳遞參數
一些高級語言傳遞參數

高級語言函數調用

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

shell函數中的局部變量和全局變量
全局變量

局部變量

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

函數庫
為什么要定義函數庫

函數庫示例:
定義一個函數庫,該函數庫實現以下幾個函數:
- 1.加法函數add add 12 89
- 2.減法函數reduce reduce 90 30
- 3.乘法函數multiple multiple 12 10
- 4.除法函數divide divide 9 3
- 5.打印系統運行情況的函數sys_load,該函數可以顯示內存運行情況,磁盤使用情況
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

庫函數經驗之談:
- 庫文件名的后綴是任意的,但一般使用.lib
- 庫文件通常沒有可執行權限
- 庫文件無需和腳本放在同級目錄,只需要在腳本中引用時指定
- 第一行一般使用#!/bin/echo,輸出警告信息,避免用戶執行
