定義
#!/bin/bash
name1 ()
{
echo "123"
}
function name2
{
echo "123"
}
function name3 ()
{
echo 123
}
複製代碼
三種方法均可以
這裏後面全部用到的定義都是用function name { command.. }
這樣的方法
調用
name1
name2
name3
複製代碼
練習
使用一個函數來判斷nginx是否在運行,若是不在運行則運行nginx
#!/bin/bash
function nginx_start
{
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
}
nginx_start
複製代碼
補充關於$的特殊用法:
$# 傳遞到腳本的參數個數
$* 以一個單字符串顯示全部向腳本傳遞的參數
*相同,可是使用時加引號,並在引號中返回每一個參數。
$- 顯示Shell使用的當前選項,與set命令功能相同。
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其餘任何值代表有錯誤
函數的參數
函數參數不須要像其餘的編程語言同樣有形參
函數參數能夠直接在函數內使用 $1 $2 n
在使用$(( ))
作運算的時候,必定要加$
符號
用法
#!/bin/bash
function params
{
echo "hello $1 "
echo "hello $2 "
echo "hello $3 "
}
複製代碼
params params1 params2 123
複製代碼
案列
簡單的計算器實現
#!/bin/bash
function calculator
{
case $2 in
+)
echo "`expr $1 + $3 `"
;;
-)
echo "`expr $1 - $3 `"
;;
\*)
echo "`expr $1 \* $3 `"
;;
/)
echo "`expr $1 / $3 `"
;;
esac
}
複製代碼
關於case的用法
case 值 in
匹配值1)
command 1
command 2
...
command N
;;
匹配值2)
command 1
command 2
...
command N
;;
esac
複製代碼
再次提醒: 須要先sh 這個文件 而後再在命令行中使用下列命令。
調用
calculator 12 + 3
calculator 12 - 3
calculator 12 * 3
calculator 12 / 3
複製代碼
函數返回值
函數的返回值能夠有return 和 echo 兩種方法
return 通常作狀態碼返回 範圍是1-255 後面不跟數字默認爲0
echo 做爲結果值返回,通常能夠爲字符串、字符串列表 、數字等等 返回的結果直接打印在終端
案例
返回0 1 分別表示Nginx 在運行 和 不在運行
#!/bin/bash
function is_nginx_running
{
pid=$$
ps -ef | grep nginx | grep -v grep &> /dev/null
status=`echo $?`
if [ $status -eq 0 ] ; then
return
else
return 1
fi
}
複製代碼
調用
is_nginx_running && echo "Ningx is running" || ehco "Ningx is Stop"
複製代碼
獲取系統全部的用戶
#!/bin/bash
function get_users
{
users=`cat /etc/passwd | cut -d : -f 1`
echo $users
}
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 test 1
{
var2=123
}
function test 2
{
local var3="local variable"
echo $var2
}
function test 3
{
echo $var3
}
echo $var1 $var2 $var3
test 1
test 2
test 3
echo $var1 $var2 $var3
複製代碼
函數庫
咱們能夠經過定義一些通用的函數或者複用度比較高的函數來造成咱們的函數庫
案例 : 定義加減乘除 和 顯示系統信息的庫
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
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
複製代碼