定义与使用
第一种格式 | 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中函数的返回值只有两种方法:return
和echo
。
使用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
函数库
为了便于开发,我们需要将经常使用的重复代码封装成函数文件,函数库一般不直接执行,而是由其他脚本进行调用。库文件本身通常没有可执行权限。
定义一个函数库,该函数库实现以下几个函数:
- 加法函数add
- 减法函数reduce
- 乘法函数multiple
- 除法函数divide
- 打印系统运行情况的函数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
版权属于:带翅膀的猫
本文链接:https://www.chengpengper.cn/archives/72/
转载时须注明出处及本声明
文章中的实用建议和操作指南,让读者受益匪浅,值得珍藏。
建议增加田野调查素材,提升真实性。