Shell函数是Shell脚本中由命令集和语句组成的代码块,这个代码块可以被其他脚本或是脚本中的其他部分所调用,所以Shell函数可以使程序模块化,即把代码分隔成独立的任务块,这样,则可不必每次为了执行相同的任务而重写代码。
Shell函数
(一)函数的定义
定义函数的语法如下:
# 函数名
function_name()
{
# 函数体,在函数中执行的命令行
commands...
# 参数返回,return语句是可选的。如果没有return语句,则以函数最后一条命令的运行结果作为返回值;如果使用return语句,则return后跟数值n(数值范围:0~255)
[ return int; ]
}
或者,如果愿意,可在函数名前加上关键字function
function function_name()
{
commands...
}
如果由function关键字,则可以省略圆括号 “()”。函数体,也叫复合命令块,是包在{}之间的命令列表。
也可以在一行内定义一个函数,此时,函数体内的各命令之间必须用分号 “ ; ” 隔开,语法规则如下:
function name { command1; command2; commandN; }
或者
name() { command1; command2; commandN; }
//可以使用内部命令unset的“-f” 选项来取消函数的定义。
注意: 通常情况下,函数体外的大括号与函数体之间必须用空白符(空格、回车或制表
符等)或换行符分开,因为大括号“{}”是保留字,但只有“{”或“}”与其中间的命令列表被空格或其他Shell元字符(比如,;或|等)分隔时,才能被识别为保留字。
(二)实例
1. 一个简单的 Bash 脚本,定义了一个名为 cecho 的函数,用于以不同的颜色输出文本。
$ cat cecho.fun
#!/bin/bash
cecho() {
echo -e "\033[$1m$2\033[0m"
}
cecho 32 OK
cecho 33 OK
cecho 34 OK
cecho 35 OK
$ chmod +x cecho.fun
$ ./cecho.fun
OK
OK
OK
OK
2. 一个 Bash 脚本,用于对一个子网中的所有 IP 地址进行 ping 操作,以检查它们是否在线。下面是对脚本的逐行解析
$ cat myping.fun
#!/bin/bash
myping(){
ping -c1 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
myping 10.0.0.$i &
done
wait
$ chmod +x myping.fun
$ ./myping.fun
10.0.0.1 is up
10.0.0.2 is up
10.0.0.88 is up
10.0.0.7 is down
10.0.0.9 is down
10.0.0.6 is down
10.0.0.10 is down
10.0.0.5 is down
10.0.0.4 is down
10.0.0.3 is down
10.0.0.11 is down
10.0.0.8 is down
...
3. 一个 Bash 脚本,用于计算用户输入的一系列整数的总和。
$ cat sum.fun
#!/bin/bash
SUM=0
while :
do
read -p "请输入整数(0表示结束):" x
[ $x -eq 0 ] && break
SUM=$[SUM+x]
done
echo "总和是:$SUM"
$ chmod +x sum.fun
$ ./sum.fun
请输入整数(0表示结束):5
请输入整数(0表示结束):6
请输入整数(0表示结束):0
总和是:11
4. 一个 Bash 脚本,目的是打印出 1 到 20 之间所有能被 6 整除的数的平方。
$ cat 6.fun
#!/bin/bash
for i in {1..20}
do
[ $[i%6] -ne 0 ] && continue
echo $[i*i]
done
$ chmod +x 6.fun
$ ./6.fun
36
144
324