Shell编程——流程控制
1、if单分支
单分支
语法格式:
if[ 条件判断式 ]
then
程序
fi
或者if和then可以写在同一行,中间用;隔开
if[ 条件判断式 ];then
程序
fi
如果 条件判断式 成立(返回“真”),那么 then 后边的语句将会被执行;如果 条件判断式 不成立(返回“假”),那么不会执行任何语句。最后以fi来结束,正是有了 fi 来结尾,所以即使程序中有多条语句也不需要用{ }包围起来。
使用实例:当变量a的值大于18就输出OK
[root@haoming home]# a=20
[root@haoming home]# if [ $a -gt 18 ];then echo 'OK'; fi
OK
也可以在判断条件中使用逻辑运算符:
[root@haoming home]# a=20
[root@haoming home]# if [ $a -gt 18 ] && [ $a -lt 36 ];then echo OK; fi
OK
把逻辑运算符写进同一个条件判断式:
-
-a 表示逻辑与(and)
-
-o 表示逻辑或(or)
[root@haoming home]# a=20
[root@haoming home]# if [ $a -gt 18 -a $a -lt 36 ];then echo OK; fi
OK
编写shell文件测试:
#!/bin/bash
read age
read money
if [ $age -gt 30 -a $money -lt 60000 ]
then
echo "你都成年了,怎么还没存款!"
fi
执行脚本文件:
[root@haoming home]# ./test1.sh
40
10000
你都成年了,怎么还没存款!
read 读取控制台的输
语法:
read 选项 参数
选项:
- -p 该选项会用一段文本来提示用户输入
- -t 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。如果不指定会一直等待。
参数:
- 指定读取的变量名
使用实例:
read -t 10 -p "请输入信息:" name
2、if多分支
双分支 if else语句
if else 语句语法格式:如果 条件判断式 成立,那么 then 后边的 程序1 语句将会被执行;否则,执行 else 后边的 程序2 语句。
if[ 条件判断式 ]
then
程序1
else
程序2
fi
编写shell文件测试:
#!/bin/bash
if [ $1 -gt 18 ]
then
echo "已成年!"
else
echo "未成年人禁止观看"
fi
执行脚本文件:
[root@haoming home]# ./test1.sh 15
未成年人禁止观看
[root@haoming home]# ./test1.sh 20
已成年!
多分支 if elif else语句
Shell 支持任意数目的分支,当分支比较多时,可以使用 if elif else 结构,它的格式为:
if [ 条件判断式1 ]
then
程序1
elif [ 条件判断式2 ]
then
程序2
elif [ 条件判断式3 ]
then
程序3
……
else
程序4
fi
注意,if 和 elif 后边都得跟着 then。
整条语句的执行逻辑为:
- 如果 条件判断式1 成立,那么就执行 if 后边的 程序1语句;如果 条件判断式1 不成立,那么继续执行 elif,判断 条件判断式2。
- 如果 条件判断式2 成立,那么就执行 程序2语句;如果 条件判断式2 不成立,那么继续执行后边的 elif,判断 条件判断式3。
- 如果 条件判断式3 成立,那么就执行程序3语句;如果 条件判断式3 不成立,那么继续执行后边的 elif。
- 如果所有的 if 和 elif 判断都不成立,就进入最后的 else,执行 程序4语句。
编写shell文件测试:
#!/bin/bash
if [ $1 -le 2 ]; then
echo "婴儿"
elif [ $1 -ge 3 -a $1 -le 8 ]; then
echo "幼儿"
elif [ $1 -ge 9 -a $1 -le 17 ]; then
echo "少年"
elif [ $1 -ge 18 -a $1 -le 25 ]; then
echo "青年"
elif [ $1 -ge 26 -a $1 -le 40 ]; then
echo "成年"
elif [ $1 -ge 41 -a $1 -le 60 ]; then
echo "中年"
else
echo "老年"
fi
执行脚本文件:
[root@haoming home]# ./test1.sh 1
婴儿
[root@haoming home]# ./test1.sh 7
幼儿
[root@haoming home]# ./test1.sh 15
少年
[root@haoming home]# ./test1.sh 20
青年
[root@haoming home]# ./test1.sh 30
成年
[root@haoming home]# ./test1.sh 45
中年
[root@haoming home]# ./test1.sh 65
老年
3、case多分支
Shell 支持两种分支结构(选择结构),分别是 if else 语句和 case in 语句。
case in 语句适用场景:分支较多,并且判断条件比较简单。
case in语法格式:
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
"值3")
程序3
;;
……
*)
程序4
esac
说明:
-
如果变量和某个值匹配成功,就会执行这后面对应的所有语句,直到遇见双分号
;;
才停止;然后整个 case 语句就执行完了。 -
如果 变量没有匹配到任何一个值,就会执行
*)
后面的语句,直到遇见双分号;;
或者esac
才结束。*)
相当于多个 if 分支语句中最后的 else 部分。最后一个分支可以写;;
,也可以不写,因为无论如何,执行到 esac 都会结束整个 case in 语句。
注意事项:
-
case行尾必须是
in
,每一个模式匹配必须以)
结束 -
这里的
;;
和*)
就相当于Java中的 break 和 default。
编写shell文件测试:
#!/bin/bash
case $1 in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
执行脚本文件:
[root@haoming home]# ./test1.sh 2
Tuesday
[root@haoming home]# ./test1.sh 6
Saturday
[root@haoming home]# ./test1.sh 10
error
4、for循环
Shell中 for 循环有两种使用形式,一种是C语言形式;另一种是Python形式
一、C语言形式
C语言形式 for 循环语法格式如下:
for((变量初始值; 循环控制条件; 变量变化))
do
程序
done
编写shell文件测试:进行累加操作
#!/bin/bash
sum=0
for ((i=1; i<=$1; i++))
do
((sum+=i))
done
echo "sum=$sum"
执行脚本文件:
[root@haoming home]# ./test1.sh 10
sum=55
[root@haoming home]# ./test1.sh 100
sum=5050
[root@haoming home]# ./test1.sh 1000
sum=500500
二、Python形式
Python形式for 循环语法格式如下:每次循环都会从in后面的取值列表中取出一个值赋给变量,然后进入循环体,执行循环体中的 程序。直到取完取值列表中的所有值,for循环就结束了。
for 变量 in 值1 值2 值3 ...
do
程序
done
编写shell文件测试:取值列表为 1 2 3 4 5
#!/bin/bash
sum=0
for x in 1 2 3 4 5
do
((sum+=x))
done
echo "sum=$sum"
执行脚本文件:
[root@haoming home]# ./test1.sh
sum=15
取值列表可以直接给出具体的值(如 1 2 3 4 5 ),也可以给出一个范围,如下:取值列表为{1…100}
#!/bin/bash
sum=0
for x in {
1..100}
do
((sum+=x))
done
echo "sum=$sum"
5、while循环
当判断条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。
while循环语法格式:
while ((判断条件式))
do
程序
done
编写shell文件测试:取值列表为 1 2 3 4 5
#!/bin/bash
read a
read b
sum=0
while (($a <= $b))
do
((sum+=a))
((a++))
done
echo "sum=$sum"
执行脚本文件:
[root@haoming home]# ./test1.sh
1
10
sum=55