Shell編程—【04】函數的定義、參數、變量做用域、函數庫

定義

#!/bin/bash
#
# method one 
name1()
{
    echo "123"
}

# method two 
function name2
{
    echo "123"
}

function name3()
{
	echo 123
}
複製代碼
  • 三種方法均可以
  • 這裏後面全部用到的定義都是用function name { command.. }這樣的方法

調用

# call function by name
name1
# 123
name2
# 123
name3
# 123
複製代碼

練習

  • 使用一個函數來判斷nginx是否在運行,若是不在運行則運行nginx
#!/bin/bash
#

# if nginx is down, start it

function nginx_start
{
    # get pid
    pid=$$

    while true
    do
        ps -ef | grep nginx | grep -v grep | grep -v pid &> /dev/null
        status=$?
        if [ "$status" -eq 0 ] ; then
            echo "Nginx is running well."
        else
            systemctl start nginx
            echo "Nginx is down, start it...."
        fi
        sleep 3
    done
}
# 若是這裏不調用執行sh 命令是沒有任何結果的。須要執行了sh後再執行nginx_start
nginx_start

複製代碼

補充關於$的特殊用法:

  • $# 傳遞到腳本的參數個數
  • $* 以一個單字符串顯示全部向腳本傳遞的參數
  • 腳本運行的當前進程ID號
  • @	與*相同,可是使用時加引號,並在引號中返回每一個參數。
  • $- 顯示Shell使用的當前選項,與set命令功能相同。
  • $? 顯示最後命令的退出狀態。0表示沒有錯誤,其餘任何值代表有錯誤

函數的參數

  • 函數參數不須要像其餘的編程語言同樣有形參
  • 函數參數能夠直接在函數內使用 $1 $2 3 ...n
  • 在使用$(( ))作運算的時候,必定要加$符號

用法

#!/bin/bash
#

function params
{
    echo "hello $1"
    echo "hello $2"
    echo "hello $3"
}
複製代碼
  • 調用
params params1 params2 123
# hello params1
# hello params2
# hello 123
複製代碼

案列

簡單的計算器實現

#!/bin/bash
#

# a simple calculator

function calculator
{
    case $2 in 
        +)
            echo "`expr $1 + $3`"
            ;;
        -)
            echo "`expr $1 - $3`"
            ;;
        \*)
            echo "`expr $1 \* $3`"
            ;;
        /)
            echo "`expr $1 / $3`"
            ;;
    esac
}
複製代碼

關於case的用法

casein
匹配值1)
    command1
    command2
    ...
    commandN
    ;;
匹配值2)
    command1
    command2
    ...
    commandN
    ;;
esac
複製代碼

再次提醒: 須要先sh 這個文件 而後再在命令行中使用下列命令。

調用

calculator 12 + 3
# 15
calculator 12 - 3
# 9
calculator 12 * 3
# 36
calculator 12 / 3
# 4
複製代碼

函數返回值

  • 函數的返回值能夠有return 和 echo 兩種方法
  • return 通常作狀態碼返回 範圍是1-255 後面不跟數字默認爲0
  • echo 做爲結果值返回,通常能夠爲字符串、字符串列表 、數字等等 返回的結果直接打印在終端

案例

返回0 1 分別表示Nginx 在運行 和 不在運行

#!/bin/bash
#

# judge nginx was running

function is_nginx_running
{
    pid=$$

    ps -ef | grep nginx | grep -v grep &> /dev/null

    status=`echo $?`

    if [ $status -eq 0 ] ; then
        # 默認返回0
        return 
    else
        return 1
    fi
}
複製代碼

調用

is_nginx_running && echo "Ningx is running" || ehco "Ningx is Stop"
# Ningx is running
複製代碼

獲取系統全部的用戶

#!/bin/bash
#

# get all username

function get_users
{
    users=`cat /etc/passwd | cut -d : -f1`
    echo $users
}

# echo all users name
users=`get_users`
index=1
for s in $users
do
    echo "The $index user is $s."
    index=$(($index+1))
done

複製代碼

變量的做用域

  • 在shell中若是不作特殊聲明,那麼變量無論是在函數體內仍是函數外都是全局變量
  • 若是要在函數內使用局部變量須要使用local關鍵字
  • 謹慎使用全局變量。
  • 函數沒有運行 函數體定義的全局變量函數外部或者其餘函數內部訪問無效。

案列

#!/bin/bash
#
var1="hello world"

function test1
{
    var2=123
}

function test2
{
    local var3="local variable"
    echo $var2
}

function test3
{
    echo $var3
}


# 測試

echo $var1 $var2 $var3
# hello world 
test1
test2
test3
echo $var1 $var2 $var3
# hello world 123

複製代碼

函數庫

  • 咱們能夠經過定義一些通用的函數或者複用度比較高的函數來造成咱們的函數庫

案例 : 定義加減乘除 和 顯示系統信息的庫

# add reduce multiple divide sys_load
function add
{
    echo "`expr $1 + $2`"
}

function reduce
{
    echo "$(($1 - $2))"
}

function multiple
{
    echo "`expr $1 \* $2`"
}

function divide
{
    echo "$(($1 / $2))"
}

function sys_load
{
    echo "Memory Info : "
    echo 
    free -m
    echo 

    echo "Disk Usage"
    echo
    df -h
    echo
}
複製代碼

使用函數庫

  • 咱們須要先加載函數庫 而後再使用
  • 加載函數庫 可使用.source兩種方法
  • 函數庫沒有文件名後綴,不過在此建議你們使用lib 方便區分。固然也可不要文件後綴
#!/bin/bash
#
source ./lib/mylib.lib
# . ./lib/mylib.lib
add 1 2
reduce 2 1
multiple 2 2 
divide 12 3

sys_load
複製代碼
  • 結果
3
1
4
4
Memory Info : 

              total        used        free      shared  buff/cache   available
Mem:           1838        1003          89           0         746         645
Swap:             0           0           0

Disk Usage

文件系統        容量  已用  可用 已用% 掛載點
/dev/vda1        40G   16G   22G   42% /
devtmpfs        908M     0  908M    0% /dev
tmpfs           920M  4.0K  920M    1% /dev/shm
tmpfs           920M  580K  919M    1% /run
tmpfs           920M     0  920M    0% /sys/fs/cgroup
tmpfs           184M     0  184M    0% /run/user/0

複製代碼
相關文章
相關標籤/搜索