函数的应用实战
脚本中调用Shell函数
函数必须在使用前需要被定义。因此,在脚本中使用函数时,必须在脚本开始前定义函数,调用函数仅使用函数名即可。
例1:直接调用函数写一个关于阶乘的脚本。
[root@localhost ~]# cat factorial01.sh
#!/bin/bash
factorial(){ #定义函数为factorial
factorial=1
#判断i是否小于等于5,如果小于5就执行循环,完成了函数的定义
for ((i=1;i<=5;i++))
do
factorial=$[factorial * $i]
done
echo "5的阶乘是:$factorial"
}
factorial #调用函数,不需要带小括号
执行结果如下:
[root@localhost ~]# chmod a+x factorial01.sh
[root@localhost ~]# ./factorial01.sh
5的阶乘是:120
例2:传参函数写一个关于阶乘的脚本。
[root@localhost ~]# cat factorial02.sh
#!/bin/bash
factorial(){ #定义函数为factorial
factorial=1
#判断i是否小于等于5,如果小于5就执行循环,完成了函数的定义
for ((i=1;i<=$1;i++))
do
factorial=$[factorial * $i]
done
echo "5的阶乘是:$factorial"
}
factorial $1 #$1是脚本的位置参数,但是$1占据的位置为函数的参数位置
执行结果如下:
[root@localhost ~]# ./factorial02.sh 5
5的阶乘是:120
Shell函数的返回值
函数有两种返回值,分别为执行结果的返回值和退出状态码。函数执行结果的返回值使用echo等命令输出,它是函数体中调用命令的输出结果。函数的退出状态码取决于函数中执行的最后一条命令的退出状态码。
- 自定义退出状态码的语法格式为:
return 从函数中返回,用最后状态码命令决定返回值
return 0 无错误返回
return 1~255 有错误返回
函数中的关键字return可以放到函数体的任意位置,通常用于返回某些值。Shell在执行到return之后,就停止往下执行,返回到主程序的调用行。return的返回值只能是0~255的一个整数,返回值将保存到变量“$?”中。
例3:函数的返回值return脚本
[root@localhost ~]# cat return.sh
#!/bin/bash
fun2(){
read -p "enter num: " num
return $[2*$num]
}
fun2
echo "fun2 return value: $? "
执行结果如下:
[root@localhost ~]# chmod a+x return.sh
[root@localhost ~]# ./return.sh
enter num: 2
fun2 return value: 4
[root@localhost ~]# ./return.sh
enter num: 244
fun2 return value: 232
当返回值(浮点数及字符串)大于255时,方法是把函数的返回值输入到一个变量中。如下
[root@localhost ~]# cat return_out.sh
#!/bin/bash
fun2(){
read -p "enter num: " num
echo $[2*num]
}
result=`fun2`
echo "fun2 return value: $result"
执行结果如下:
[root@localhost ~]# ./return_out.sh
enter num: 233
fun2 return value: 466
Shell函数数组变量的传参
例4:数组变量的传参。
[root@localhost ~]# cat fun_array.sh
#!/bin/bash
num=(1 2 3 4 5)
array() {
local factorial=1
for i in $*
do
factorial=$[factorial * $i]
done
echo "$factorial"
}
array ${num[*]}
执行结果如下:
[root@localhost ~]# chmod a+x fun_array.sh
[root@localhost ~]# ./fun_array.sh
120
内置命令和外部命令的区别
内部命令实际上是Shell程序的一部分。内部命令中包含一些比较简单的Linux系统命令。这些系统命令由解释器识别并在Shell程序内部完成运行,通常在Linux系统加载运行时就被加载并驻留在系统内存中。内部命令(如exit、history、cd、echo等)是写在bash源码里面的,其执行速度比外部命令快,因为Shell在解析内部命令时不需要创建子进程。
外部命令是linux命令中的实用程序。因为实用程序的功能比较强大,所以它包含的程序量也比较大。系统加载时,并不随系统一起被加载到内存中,只是在需要时才被调用。外部命令的实体并不包含在Shell中,但其命令执行过程是由Shell程序控制的。Shell程序可以管理外部命令执行的路径查找、加载和存放。此外,Shell程序还可以执行并发控制命令。通常在/bin、/usr/bin、/sbin、/usr/sbin等目录当中。可通过”echo $PATH“命令查看外部命令的存储路径。
- 用type命令可以分辨内部命令跟外部命令
[root@localhost ~]# type cd
cd is a shell builtin
[root@localhost ~]# type mkdir
mkdir is /usr/bin/mkdir
两种命令之间最大的区别就是性能。由于内部命令构建在Shell中。因此不必创建多余的进程,要比外部命令执行更迅速。
Shell内置命令
循环结构中break、continue、return和exit的区别
- 具体说明
命令 | 说明 |
---|---|
break | 强制退出最近的一层循环,用于for、while、repeat语句中强制退出 |
continue | 用于从for、while、repeat语句中结束循环内的本次处理,继续从循环体的开始位置继续执行 |
return | 在函数中将数据返回,或返回一个结果给调用函数的脚本,只退出函数,不退出脚本 |
exit | 退出当前的Shell程序,退出脚本 |
break命令使用场合主要是switch语句和循环语句。break命令表示直接退出循环,执行循环结构下面的第一句语句。如果在多重嵌套循环中使用break命令,当执行break命令时,退出它所在的循环结构,对外层循环没有影响。
continue命令并没有真正的退出循环,只是结束本次循环的执行,使用continue命令时要注意这一点。
如果在程序中遇到return命令,那么就退出该函数的执行,退出到函数的调用数;如果在main()函数遇到return命令,则结束整个程序的运行。
exit命令和return命令的最大区别在于,调用exit命令将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。当exit命令中的参数为0时,表示正常退出,其他返回值表示非正常退出,执行exit命令意味着进程结束。
break、continue、exit命令执行流程图
- for循环中的break命令
- while循环中的break命令
- for循环中的continue命令
- while循环中的continue命令
break命令和continue命令案例实战
1.continue命令跳出循环
例1:最外层for循环打印出A、B、C、D,里面的for循环打印1-9数字,判断$j数字是否等于5,如果等于5则本次整个循环结束,开启下一轮循环。
[root@localhost ~]# cat continue.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #-n显示不换行
for j in {1..9} #内循环打印1-9数字
do
if [ $j -eq 5 ];then #判断j是否等于5.如果等于5则跳出本次循环,开始下一轮循环
continue
fi
echo -n $j
done
echo #打印换行
done
执行结果如下:
[root@localhost ~]# chmod a+x continue.sh
[root@localhost ~]# ./continue.sh
A12346789
B12346789
C12346789
2.break命令终止循环
例2:最外层for循环打印出A、B、C、D,里面的for循环打印1-9数字,判断$j数字是否等于5,如果等于5则退出整个循环。
[root@localhost ~]# cat break.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i #-n显示不换行
for j in {1..9} #内循环打印1-9数字
do
if [ $j -eq 5 ];then #判断j是否等于5.如果等于5则跳出本次循环,开始下一轮循环
break
fi
echo -n $j
done
echo #打印换行
done
执行结果如下:
[root@localhost ~]# ./break.sh
A1234
B1234
C1234
D1234
shift命令
对于位置参数或命令行参数来说,其个数必须是确定的;当shell程序不知道其个数时,可以把所有的参数赋值给变量$*。若用户要求Shell在不知道位置变量个数的情况下,还能逐一处理这些参数,也就是$1后面为$2,后为$3等,此时就需要使用shift。
shift n表示把第n+1个参数移到第一个参数,即命令结束后$1的值等于$n+1的值,而命令执行前的前面n个参数不能被再次引用。在程序中每使用一次shift语句,都使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
shift命令用于参数的移动(左移),通常使用在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理。
例1:
[root@localhost ~]# cat shift.sh
#!/bin/bash
while [ $# -ne 0 ] #判断参数如果不等于0则执行下面循环
do
useradd $1
echo "$1 is created"
shift
done
执行结果如下:
[root@localhost ~]# chmod a+x shift.sh
[root@localhost ~]# ./shift.sh y55
y55 is created