# 函数及其的高级用法

# 语法格式

  • 第一种语法
test() {
    echo 1
}

test
  • 第二种语法
function test { # 这里macOS中test是可以加()的function test() {}
    echo 2
}

test

# 如何调用

  • 直接使用函数名调用,可以将函数想像成 shell 的一条命令

  • 函数内部可以直接使用参数$1、$2...$n

  • 调用使用 function_name $1 $2

sh case/function/function.sh 外部参数1 外部参数2

echo $1 # 外部参数1
echo $2 # 外部参数2

test() {
    echo $1 # 内部参数1
    echo $2 # 内部参数2
}

test 内部参数1 内部参数2

# 函数参数以及传递

# 语法

function test {
    echo $1
    echo $2
    echo $n
}

test 参数1 参数2 参数n
  • $# 表示函数参数个数,和 shell 一样

# 函数的返回值

方式 用法
方式 1 return,只能返回 1-255 的整数
方式 2 echo,可以返回任何字符串结果
  • 函数使用 return 返回值,通常只是用来供其他地方调用获取状态,因此通常仅用来返回 0 或者 1,0 表示成功,1 表示失败,

  • 类似与网络的状态码 code,return 之后这个值是$?可以获取的,是会影响$?的值的,$?只要是非 0 即可判断为失败,所以 return 在 1-255 之间可以自己定义和规范如何根据值判断

  • echo 通常用于返回数据,比如一个字符串值或者一个列表值

例子:返回 Linux 上所有的不可登陆用户 unlogin.sh

function get_users
{
    echo `cat /etc/passwd | awk -F: '/\/sbin\/nologin/{print $1}'`
}

index=1
for user in `get_users`;do # 遍历返回的列表值
    echo "The $index user is $user"
    index=$(expr $index + 1)
done

echo
echo "System have $index users(do not login)"

# 局部变量和全局变量

  • 不做特殊声明,shell 中变量都是全局变量,比如一个变量被定义在一个函数中,一旦这个函数被调用,那么之后任何地方都可以使用这个变量,但没有被调用则不能使用

  • Tips:大型脚本程序中应该慎用全局变量

test1() {
    var2=222
    var1=333 # 覆盖外部变量值
}

var1=111

echo $var1 # 111
echo $var2 # 没有输出

test1

echo $var1 # 333
echo $var2 # 222

function test2() {
    echo $var2 # 222
}

test2

# 局部变量

  • 使用 local 关键字

  • 函数内外同事存在同名变量,则函数内部会覆盖函数外部变量

test1() {
    local var1=222
}

test1

echo $var1 # 没有输出

function test2() {
    echo $var1 # 没有输出
}

test2

# 函数库

# 定义

经常使用的重复代码封装成的函数文件

# 使用

  • 通过. 绝对文件路径+文件名引用函数库文件

  • ⚠️ 相对路径是无法引用的

  • 一般不直接执行,而是由其他脚本调用

  • 库文件名的后缀是任意的,但通常使用.lib

  • 库文件通常是没有可执行权限的

  • 库文件无需和脚本文件在同一目录,只需在脚本中引用(绝对路径)即可

  • 第一行一般使用#!/bin/echo,输出警告信息,避免用户执行

base_function.sh

function add() {
    echo $(expr $1 + $2)
}
function reduce() {
    echo $(expr $1 - $2)
}
function multiple() {
    echo $(expr $1 \* $2)
}
function divide() {
    echo $(expr $1 / $2)
}

use_base_function.sh

. /Users/lijinchao/mySelf/code/Shell/case/function/base_function.sh

add 1 2
reduce 1 2
multiple 1 2
divide 1 2