目录
1.4.3、直接将函数的输出结果赋值给变量,不是返回值给变量
1、定义新的函数(必须先定义后使用)
格式:
调用已定义的函数:函数名
向函数内传递参数(可以`使用位置参数):函数名 参数1 参数2
1.1、main函数
做脚本的需求分析的时候,把每一个功能都做成函数。最后写一个main函数,通过case语句带哦也能够所有的其他函数,main函数作为脚本的唯一的入口。
1.2、函数嵌套和变量的作用域问题
- 函数里可以调用其他的函数,但是被调用函数需要提前定义
- 函数自己也可以调用自己
- A函数里的变量i,B函数是可以引用的,默认函数里的变量是全局变量,其他函数可以使用,所以要注意变量名不要重复
1.3、用case和while循环写一个脚本
[root@fttswlp fun]# date +%b
Jun
1.4、函数使用两种变量
全局变量:在函数内部定义的变量,脚本主代码可以获取,脚本主代码定义变量,函数内部也可以获取
局部变量:"local 变量名",确保变量仅在函数内部使用
1.4.1、return
return的值在0~255
1.4.2、return和exit的区别
- return是退出函数的时候,指定返回值,而且return后面的语句不再执行。如果没有指定返回值,默认是0。
- return出现在函数中的,并且用来退出函数的;exit出现在进程(脚本)中,并且用来退出进程的
[root@fttswlp fun]# cat fun.sh
func(){
if (($1 > S2))
then
echo "$1 > $2"
return 10
else
echo "$1 < $2"
return 20
fi
}
func 30 50
echo $?
exit 90
echo "hello beautiful world"
############### 结果
[root@fttswlp fun]# bash fun.sh
30 > 50
10
[root@fttswlp fun]# echo $?
90
1.4.3、直接将函数的输出结果赋值给变量,不是返回值给变量
[root@fttswlp fun]# cat fun2.sh
func(){
echo "$1"
return 10
}
num=func
num1=$(func 200 )
echo $num $num1
######## 结果
[root@fttswlp fun]# bash fun2.sh
func 200
2、函数库文件
如果多个脚本需要调用重复的函数,没必要在每个脚本中定义,只需要创建函数库文件,将需要的函数都放到这个库文件。每个脚本只需要一条语句调用库文件即可。
注意:不能把库文件当作普通脚本 一样在脚本中运行,那样那些函数将不会出现在脚本中。
[root@fttswlp fun]# cat fun3.sh
. fun2.sh
func 5000
######### 结果
[root@fttswlp fun]# bash fun3.sh
func 200
5000
在脚本中调用库文件(注意库文件的路径)
方法:使用source或者 "." (操作符) + 库文件路径
3、case
针对变量的不同取值,分别执行不同的命令序列
[root@fttswlp fun]# cat case.sh
#!/bin/bash
case $1 in
start)
echo "启动服务"
mkdir -p ff && echo "yy"
;;
stop)
echo "停止服务"
;;
restart|reload)
echo "停止服务"
echo "正在启动服务"
;;
*)
echo "usages: please use start|stop|restart"
;;
esac
###############运行结果
[root@fttswlp fun]# bash case.sh start
启动服务
yy
[root@fttswlp fun]# bash case.sh stop
停止服务
[root@fttswlp fun]# bash case.sh restart
停止服务
正在启动服务
[root@fttswlp fun]# bash case.sh relopd
usages: please use start|stop|restart
[root@fttswlp fun]# bash case.sh reload
停止服务
正在启动服务
4、while
4.1、三种无限循环的写法
- while :
- while true
- while [1]
[root@fttswlp fun]# cat while.sh
#!/bin/bash
#控制循环次数的例子
i=1
while (( i < $1 ))
do
echo $i
((i++))
done
# 死循环控制退出
k=1
while :
do
if (( $k == 3 ))
then
break
fi
echo $k
((k++))
done
####### 结果
[root@fttswlp fun]# bash while.sh 6
1
2
3
4
5
1
2
4.1.1、自增的两种方法
i++(先引用再运算)和++i(先运算再引用)
[root@fttswlp fun]# i=1
[root@fttswlp fun]# n=$((i++))
[root@fttswlp fun]# echo $i $n
2 1
[root@fttswlp fun]# i=1
[root@fttswlp fun]# m=$((++i))
[root@fttswlp fun]# echo $i $m
2 2