什么是函数?
1 2 |
函数就是用来盛放一组代码的容器,函数内的一组代码完成一个特定的功能,称之为一组代码块,调用函数便 可触发函数内代码块的运行,这可以实现代码的复用,所以函数又可以称之为一个工具 |
为何要用函数
1 2 3 |
1、减少代码冗余 2、提升代码的组织结构性、可读性 3、增强扩展性 |
语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#第一种 function test1(){ echo "执行第一个函数" } #第二种 function test2 { echo "执行第二个函数" } #第三种 test3(){ echo "执行第三个函数" } # 调用函数:直接引用函数名字即调用函数,会触发函数内代码的运行 test1 test2 test3 |
函数中return说明:
1 2 3 |
1.return可以结束一个函数。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。 2. return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。 3. 如果没有return命令,函数将返回最后一个指令的退出状态值。 |
函数参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#在函数体内部,通过 $n 的形式来获取参数的值,例如, $1 表示第一个参数, $2 表示第二个参数...当n>=10时,需要使用 ${n} 来获取参数 [root@clf ~]# cat b.sh function test1(){ echo "...start..." echo $1 echo $2 echo $3 echo "...end..." } test1 111 222 333 444 555 # 为函数体传参 [root@clf ~]# ./b.sh ...start... 111 222 333 ...end... |
局部变量: 只能在函数内访问
使用local关键字定义在函数内的变量属于局部范围
1 2 3 4 5 6 7 8 9 10 |
[root@lb01 ~]# vim test.sh function fun() { local x=111 echo "函数内: $x" } [root@lb01 ~]# source test.sh [root@lb01 ~]# fun 函数内: 111 |
全局变量:可以在当前shell中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 函数内部不加local相当于全局变量 # 要先调用,后引用 # 子bash看不到 y=222 function fun() { x=111 echo "函数内: $x" } fun echo "函数外:x=$x" echo "函数外: y=$y" [root@lb01 ~]# source test.sh 函数内: 111 函数外:x=111 函数外: y=222 |
环境变量:在当前进程的子进程中都可以使用
- 环境变量只能向下传递而不能向上传递,即“传子不传父”。
- 两个没有父子关系的 Shell 进程是不能传递环境变量的
- env查看当前用户的环境变量
1 2 3 4 5 6 7 |
# 全局子bash可以看到 [root@lb01 ~]# vim /etc/profile ······ g=666666 [root@lb01 ~]# source /etc/profile [root@lb01 ~]# echo $g 666666 |
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 所有参数 |
$@ | 所有参数,与$*类似 |
$$ | 当前脚本进程的ID号 |
$? | 获取上一条命令执行完毕后的退出状态。0表示正确,非0代表错误,如果执行的是函数那么$?取的是函数体内return后的值 |
1 2 3 4 5 |
1、当$*和$@没有被引号引用起来的时候,它们确实没有什么区别,都会把位置参数当成一个个体。 2、"$*" 会把所有位置参数当成一个整体(或者说当成一个单词),如果没有位置参数,则"$*"为空,如 果有两个位置参数并且分隔符为空格时,"$*"相当于"$1 $2" 3、"$@" 会把所有位置参数当成一个单独的字段,如果没有位置参数,则"$@"展开为空(不是空字符串, 而是空列表),如果存在一个位置参数,则"$@"相当于"$1",如果有两个参数,则"$@"相当于"$1" "$2"等等 |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
[root@lb01 ~]# vim test.sh echo "============函数1===========" function test1() { for x in "$@" do echo "$x" done } test1 111 222 333 "444 555" echo "============函数2===========" function test2() { for y in "$*" do echo "$y" done } test2 111 222 333 "444 555" #结果 [root@lb01 ~]# ./test.sh ============函数1=========== 111 222 333 444 555 ============函数2=========== 111 222 333 444 555 |
函数的返回值
函数内可以有多个return,但只要执行一个,整个函数就会立刻结束
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@clf ~]# cat b.sh function test1(){ echo 111 return echo 222 return echo 333 } test1 [root@clf ~]# ./b.sh 111 |
如果函数内有return,那么return后跟的只能是整型值并且范围为0-255,用于标识函数的运行结果是否正确
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@clf ~]# cat b.sh function test1(){ echo 111 echo 222 echo 333 return 100 } test1 echo $? # 用$?获取函数的返回值 [root@clf ~]# ./b.sh 111 222 333 100 |