shell 函數的高級用法

函數介紹

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 

 

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,輸出警告信息,避免用戶執行
相關文章
相關標籤/搜索