# 函数及其的高级用法
# 语法格式
- 第一种语法
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