Shell函数与模块化编程
- 1、函数定义与调用
- 2、局部变量与全局变量
- 3、函数的返回值
- 4、Shell模块化编程
1、函数定义与调用
在Shell脚本中,我们可以定义函数来封装可复用的代码逻辑。函数的定义格式如下:
[ function ] function_name [()] {# commands# [return 0~255]
}
定义函数后,只需要使用函数名称就可以调用它:
function_name
例如,我们定义一个加法函数并调用它:
#!/bin/bash
# 定义函数
function add () {z=$[ $1+$2 ]echo $z
}
read -p "请输入x = " x
read -p "请输入y = " y
# 调用函数
sum=$(add $x $y)
echo "x + y = $sum"
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$n
的形式来获取参数的值,例如,$1
表示第一个参数,$2
表示第二个参数
另外,需要注意的是,return
命令只能返回一个介于0~255
之间的整数,而两个输入数字的和可能超过这个范围,因此需要使用echo
输出
2、局部变量与全局变量
在Shell脚本中,我们可以定义全局变量和局部变量。全局变量在脚本的任何地方都可以访问,而局部变量只在定义它的函数内部可见
Shell局部变量使用local
关键字来定义:
#!/bin/bash
# 定义函数
func () {# 局部变量local local_var="I'm local!"# 全局变量global_var="I'm global!"
}
# 调用函数
func
# 测试局部变量与全局变量
echo $local_var # 输出为空
echo $global_var # I'm global!
3、函数的返回值
Shell函数通过两种方式返回值:退出状态码和函数输出
- 退出状态码:每个命令(包括函数)在结束时都会返回一个退出状态码,
0
表示成功,非0
表示出错。可以使用return
命令来设置函数的退出状态码,使用$?
来获取上一个命令的退出状态码 - 函数输出:函数中
echo
或printf
命令的输出可以作为返回值。我们可以使用命令替换$(func [args])
来获取这些输出
例如,我们定义一个函数来检查一个数是否为正数:
#!/bin/bash
# 定义函数
is_positive () {if [ $1 -gt 0 ]; thenecho "yes"return 1elseecho "no"return 0fi
}# 调用函数并获取返回值
result=$(is_positive 5)
# 获取函数的退出状态码
status=$?echo $result # yes
echo $status # 1
4、Shell模块化编程
在复杂的Shell脚本中,我们可以通过将代码分解为独立的模块(函数或脚本)来提高代码的可读性和可维护性
- 将复用的代码逻辑封装为函数,如上述示例所示
- 如果有多个脚本需要共享一些函数或变量,可以将这些函数或变量写在一个单独的脚本文件中,然后在其他脚本中通过
source
命令或.
命令来引入这个文件
例如,我们有一个包含公共函数的脚本common.sh
:
#!/bin/bash
common_func () {echo "This is a common function."
}
在另一个脚本中,我们可以引入这个外部文件并使用它的函数:
#!/bin/bash
source common.sh
# . ./common.sh# 调用common.sh中的函数
common_func # This is a common function.
其中,source
命令可以省略当前路径前的./