定义与使用

第一种格式 name()
{
      command1
      command2
      ...
      commandn
}
第二种格式 function name
{
      command1
      command2
      ...
      commandn
}

直接使用函数名调用函数即可。

参数传递

      与高级语言中函数传递参数不同,shell中不需要再函数名后面加括号进行传参,而在函数体中直接使用即可。详情看示例。

示例

#!/bin/bash

function test1
{
        
    echo $1
    echo $2
}

# 函数传参
test1 1 2

      写一个脚本,该脚本可实现计算器的功能,进行四则运算。

#!/bin.sh

function calculate
{
    case $2 in
        +)echo "$1 + $3 = $(expr $1 + $3)";;
        -)echo "$1 - $3 = $(expr $1 - $3)";;
        \*)echo "$1 * $3 = $(expr $1 \* $3)";;
        /)echo "$1 / $3 = $(expr $1 / $3)";;
    esac
}

calculate $1 $2 $3

# 调用:sh calculate.sh 1 + 2
->1 + 2 = 3

返回值

      shell中函数的返回值只有两种方法:returnecho
      使用return返回值只能返回1~255的整数,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1。echo一般返回字符串。

#!/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 stop"

只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行
只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c
语言中的逻辑或语法功能相同,即实现短路逻辑或操作。

#!/bin/bash

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

user_list=`get_users`
for user in $user_list
do
    echo $user
done

局部变量和全局变量

      不做特殊声明,shell中变量都是全局变量。大型脚本程序中慎用全局变量。如果需要在函数内部使用局部变量需要使用local关键字。
      如果函数内和函数外存在同名变量,就近原则,即函数内部变量覆盖外部变量。

# 使用local前
#!/bin/bash

var1="hello shell"

function test
{
    var2=100
}

echo $var1
echo $var2

test

echo $var2
# 输出
hello shell

100

# 使用local后
local var2=100

# 输出
hello shell

函数库

      为了便于开发,我们需要将经常使用的重复代码封装成函数文件,函数库一般不直接执行,而是由其他脚本进行调用。库文件本身通常没有可执行权限。
      定义一个函数库,该函数库实现以下几个函数:

  1. 加法函数add
  2. 减法函数reduce
  3. 乘法函数multiple
  4. 除法函数divide
  5. 打印系统运行情况的函数sys_load,该函数可以显示内存运行情况。
# 函数库:func
function add
{
    echo "`expr $1 + $2`"
}

function reduce
{

    echo "`expr $1 - $2`"
}

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

function devide
{

    echo "`expr $1 / $2`"
}

function sys_load
{
        echo "Memory Info"
        echo 
        free -m
        echo
        echo "Disk Usage"
        echo 
        df -h
        echo
}


# 使用函数库
#!/bin/bash

# 使用绝对路径
. /opt/shellLearn/unit03/func

add 1 2
reduce 999 200
multiple 999 999
devide 6 3
sys_load
Last modification:May 13th, 2020 at 12:40 pm
如果觉得我的文章对你有用,请随意赞赏