Shell 流程控制
shell也可以像其他语言一样,有流程控制。shell的流程控制一般包括
- if判断。
- for循环
- while循环
- until
- case
1、if判断
shell的if判断语句有三种语法,分别为
- if判断
- if~else判断
- if~else if~else判断
1.1、简单的if判断
if语法
if判断:
if [ 条件判断式 ]
then
程序
fi
或 if [ 条件判断式 ];then 程序;fi
案例
编写一个程序,当输入分数时判断是否及格
[root@root test02]# vim test01.sh
read -p "请输出您的成绩:source=" grade
if [ $grade -ge 60 ]
then
echo "您的成绩为$grade,及格了"
fi
[root@root test02]# chmod +x ./test01.sh
[root@root test02]# ./test01.sh
请输出您的成绩:source=99
您的成绩为99,及格了
1.2、if~else判断
if~else语法
if [ 条件判断式 ]
then
程序
else
程序
fi
案例
[root@root test02]# vim test01.sh
read -p "请输出您的成绩:source=" grade
if [ $grade -ge 60 ]
then
echo "您的成绩为$grade,及格了"
else
echo "您的成绩为$grade,小于及格线(60)"
fi
[root@root test02]# ./test01.sh
请输出您的成绩:source=59
您的成绩为59,小于及格线(60)
1.2、if~else if~else判断
if~else if~else语法
if [ 条件判断式 ]
then
程序
elif [条件判断式]
then
程序
else
程序
fi
案例
[root@root test02]# vim test01.sh
read -p "请输出您的成绩:source=" grade
if [ $grade -ge 90 ]
then
echo "您的成绩为$grade,优秀"
elif [ $grade -ge 80 -a $grade -lt 90 ]
then
echo "您的成绩为$grade,良好"
elif [ $grade -ge 70 -a $grade -lt 80 ]
then
echo "您的成绩为$grade,中等"
elif [ $grade -ge 60 -a $grade -lt 70 ]
then
echo "您的成绩为$grade,及格"
else
echo "您的成绩为$grade,没达到及格线"
fi
[root@root test02]# ./test01.sh
请输出您的成绩:source=56
您的成绩为56,没达到及格线
[root@root test02]# ./test01.sh
请输出您的成绩:source=78
您的成绩为78,中等
2、case~esac多选择
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构。
语法
case $变量名 in
"值 1")
如果变量的值等于值 1,则执行程序 1
;;
"值 2")
如果变量的值等于值 2,则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
esac
注
- 每个 case 分支用右圆括号开始,用两个冒号
;;
表示 break。 - $变量名也就是值。
- 取值后面必须为单词 in,每一模式(值1,值2…)必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,以
;;
为一个程序,即以;;
结束一种模式。 - *)表示没有匹配的值,此时就执行该条语句。
案例
根据输入的月份选择季度
[root@root test02]# vim test01.sh
echo “按月选择季度”
read -p "请输入数字(1-12):num=" num
case $num in
1|2|3)
echo "第一季度"
;;
4|5|6)
echo "第二季度"
;;
7|8|9)
echo "第三季度"
;;
10|11|12)
echo "第四季度"
;;
*)
echo "输入错误,注输入的数字必须在1-12之间"
;;
esac
[root@root test02]# ./test01.sh
“按月选择季度”
请输入数字(1-12):num=5
第二季度
[root@root test02]# ./test01.sh
“按月选择季度”
请输入数字(1-12):num=13
输入错误,注输入的数字必须在1-12之间
break和continue的区别
break跳出整个循环
continue跳出当前循环
3、for循环
Shell与其他编程语言类似也支持for循环,即执行一次所有命令
3.3、基本for循环
基本语法
for 变 量 in 值 1 值 2 值 3…
do
程序
done
或
for 变 量 in 值 1 值 2 值 3…;do 程序;done;
注
- in 列表可以包含字符串和文件名。
- in列表是可选的,如果不用它,for循环使用命令行的
位置参数。
案例
顺序打印出1-4
[root@root test02]# vim test01.sh
for i in 1 2 3 4
do
echo "the num is $i"
done
[root@root test02]# ./test01.sh
the num is 1
the num is 2
the num is 3
the num is 4
#或者用一行表示法
[root@root test02]# vim test01.sh
for i in 1 2 3 4;do echo "The num is $i";done;
[root@root test02]# ./test01.sh
the num is 1
the num is 2
the num is 3
the num is 4
3.4、增强for循环
增强语法
for ((初始值;循环控制条件;变量变化 ))
do
程序
done
或
for (( 初始值;循环控制条件;变量变化 ));do 程序;done;
案例
计算1-100的和
[root@root test02]# vim test01.sh
sum=0
for((i=0;i<=100;i++))
do
sum=$[ $sum + $i]
done
echo "1-100的和为:total=$sum"
[root@root test02]# ./test01.sh
1-100的和为:total=5050
4、while循环
Shell与其他编程语言类似也支持while循环,即执行多次所有命令
语法
while [ 条件判断式 ]
do
程序
done
注
- 当 条件判断式为
true
时,此时为死循环,即无限循环下去; - 当 条件判断式为
空格:
时,此时为死循环,即无限循环下去;
案例
10秒倒计时
[root@root test02]# vim test01.sh
i=10
echo "10秒倒计时开始"
while(( $i<=0 ))
do
echo $i
let "i--"
done
echo "10秒倒计时结束"
[root@root test02]# ./test01.sh
10秒倒计时开始
10
9
8
7
6
5
4
3
2
1
0
10秒倒计时结束
2.无限循环
i=0
while :
do
echo "无限叠加$(i++)"
done
5、until循环
Shell中的until也是一种循环,这种循环与我们平时见到的循环不同,它是特指当判断的条件为假时,才执行循环体的中程序。
语法
until [条件表达式]
do
程序
done
注
- 只有当条件表达式为false时,才采用循环体
- 执行顺序与while相反
- 一般情况下优先级低于while循环,但有时会高于while循环
案例
10秒倒计时
[root@root test02]# vim test01.sh
i=10
echo "10秒倒计时开始"
until(( $i<0 ))
do
echo $i
let "i--"
done
echo "10秒倒计时结束"
[root@root test02]# ./test01.sh
10秒倒计时开始
10
9
8
7
6
5
4
3
2
1
0
10秒倒计时结束