Shell脚本学习_流程控制

一、流程控制:if else语句

if语法:

#多行
if    条件
then
    命令
fi

#一行
if 条件; then 命令; fi

if-else语法:

if    条件 [ 条件判断式 ]
	then
		条件成立时,执行的命令
	else
		条件不成立时,执行的另一个命令
fi

if elif else语法:

if    条件1
	then
		当条件判断式1成立时,执行命令1
elif  条件2
	then
		当条件判断式2成立时,执行命令2
elif  条件3
	then
		当条件判断式3成立时,执行命令3
...
else
	当所有条件都不成立时,最后执行该命令
fi

例子1(判断考试成绩):

[zhangjiajia@localhost ~]$ vim 3.sh
#!/bin/bash
read -p "请输入你的考试成绩:" score
if [[ score < 60 ]]
then
        echo "不及格"
elif ((score>=60 && score<70))
then
        echo "及格"
elif ((score>=70 && score<80))
then
        echo "良好"
elif ((score>=80 && score<90))
then
        echo "不错"
elif ((score>=90 && score<=100))
then
        echo "优秀"
fi

输出结果为:

[zhangjiajia@localhost ~]$ sh 3.sh
请输入你的考试成绩:88
不错

例子2(数据写入指定文件):

[zhangjiajia@localhost ~]$ vim 4.sh
#!/bin/bash
read -p "请输入文件名:" filename
read -p "请输入数据:" data
if [[ -w $filename && -n data ]]
then
        echo $data >> $filename
        echo "文件写入成功"
else
        echo "文件写入失败"
fi

输出结果如下:

[zhangjiajia@localhost ~]$ sh 4.sh
请输入文件名:2.txt
请输入数据:123
文件写入成功

二、流程控制:case语句

介绍:

case语句为多选择语句,可以用case语句匹配一个值与一个模式,匹配成功则执行相匹配的命令。通常用于分支多,且判断条件简单的情况下。

注意:

case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则依次比较下一个值。如果所有的值都不符合,则执行 "*)"

(*代表所有其他值)的程序。

case语句以"case"开头,以"esac"结尾。

每一个分支程序之后要通过";;"双分号结尾,代表该程序段结束(千万不要忘记,每次写case语句,都不要忘记双分号)。

基本语法:

case 值 in
匹配模式1)
	命令1
    命令2
    ...
	;;
	"值2")
匹配模式2)
	命令1
    命令2
    ...
	;;
*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac

case语句支持正则表达式,只不过使用的表达式较为简单。

简单的正则表达式支持如下通配符:

格式 说明
* 表示任意的字符串。
[abc] 表示 a、b、C三个字符中的任意一个。比如,[ 15ZH ] 表示1、5、Z、H四个字符中的任意一个。
[m-n]| 表示从m到n的任意一个字符。比如,[0-9]表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。
| 表示多重选择,类似逻辑运算符中的或运算。比如,abc | xyz 表示匹配字符串"abc"或者"xyz"。

例子(输入数字判断星期):

[zhangjiajia@localhost ~]$ vim 5.sh
#!/bin/bash
read -p "请输如一个0-7的数字:" score
case $score in

1)
        echo "星期一"
        ;;
2)
        echo "星期二"
        ;;
3)
        echo "星期三"
        ;;
4)
        echo "星期四"
        ;;
5)
        echo "星期五"
        ;;
6)
        echo "星期六"
        ;;
7|0)
        echo "星期日"
        ;;
*)
        echo "错误,请重新输入"
        ;;
esac

输出结果如下:

[zhangjiajia@localhost ~]$ sh 5.sh
请输如一个0-7的数字:1
星期一
[zhangjiajia@localhost ~]$ sh 5.sh
请输如一个0-7的数字:0
星期日
[zhangjiajia@localhost ~]$ sh 5.sh
请输如一个0-7的数字:7
星期日
[zhangjiajia@localhost ~]$ sh 5.sh
请输如一个0-7的数字:9
错误,请重新输入

三、流程控制:while循环

介绍:

在while循环中,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

语法:

#多行
while 条件
do
    命令1
    命令2
    ...
    continue;  #结束本次循环,进入下一次
    break;  #结束当前循环
done


#一行
while 条件; do 命令; done;

例子:

[zhangjiajia@localhost ~]$ vim 6.sh
#!/bin/bash
read -p "请输入一个数字:" score
i=1
while true
do
        if ((i > score))
        then
                echo "循环结束"
                break;
        fi
        echo "Hello"
        ((i=i+1))  #或者let i++

done

输出结果为:

[zhangjiajia@localhost ~]$ sh 6.sh
请输入一个数字:4
Hello
Hello
Hello
Hello

四、流程控制:for循环

介绍:for循环是固定循环,也就是在循环时已经知道需要进行几次的循环,有时也把for循环称为计数循环。for的语法有如下三种:

语法:

语法1:
for var in item1 item2 ... itemN
do 
    命令1
    命令2
    ...
done

#var是循环变量
#item1 item2...itemN为循环范围

语法2:
for var in {start..end}
do 
    命令1
    命令2
    ...
done

语法3:
for((i=start;i<=end;i++))
do 
    命令1
    命令2
    ...
done

循环跳出语句介绍:

continue语句:跳出本次循环、还会进入到下一次循环。

break语句:跳出当前循环、循环结束。

当程序执行到break语句时,会结束整个当前循环。而continue 语句也是结束循环的语句,不过continue 语句是指结束本次循环,而下次循环会继续。

例子1:

[zhangjiajia@localhost ~]$ vim 7.sh
#!/bin/bash
read -p "请输入一个数字:" score
i=1
for i in 1 3 5  #第1、第3、第5
#也可以{1..5}
do
        if [[ i > score ]]
        then
                echo "循环结束"
                break;
        fi
        echo "Hello${i}"
        ((i=i+1))  #或者let i++

done

输出结果如下:

[zhangjiajia@localhost ~]$ sh 7.sh
请输入一个数字:5
Hello1
Hello3
Hello5

例子2:

[zhangjiajia@localhost ~]$ vim 9.sh
#!/bin/bash
read -p "请输入一个数字:" score

for((i=1;i<=$score;i++))
do
        echo "Hello${i}"

done

输出结果如下:

[zhangjiajia@localhost ~]$ sh 9.sh
请输入一个数字:9
Hello1
Hello2
Hello3
Hello4
Hello5
Hello6
Hello7
Hello8
Hello9

五、流程控制:until循环

介绍:

until循环与while循环等循环语句相反,while循环是条件语句为true则一直循环、until循环是条件语句判断为true则停止、判断为false则一直循环。

语法:

until 条件
do
    命令
done

例子(计算出1~输入数字至今实有数的和):

[zhangjiajia@localhost ~]$ vim 
#!/bin/bash
read -p "请输入一个大于0的数字" number
i=1
sum=0
until (( $i >$number ))
do
        sum=$(($sum+$i))
        let i++

done
 echo "和为:${sum}"

11.sh

输出结果如下:

[zhangjiajia@localhost ~]$ sh 11.sh
请输入一个大于0的数字100
和为:5050

六、流程控制:select语句

介绍:

select in 循环用来增强交互性,可以显示出带编号的菜单、用户根据不同的编号可以选择不同的菜单,并执行该功能。

语法:

select var in  menu1 menu2 ... menuN
do
    命令
done

例子(判断爱好并做出回应):

[zhangjiajia@localhost ~]$ vim 10.sh
echo "您的爱好是:${score}"
select score in "打球" "游戏" "编程"
do
    #echo "$score"
    #break;
        case $score in
        "打球")
                echo "运动有益身体健康"
                break;
                ;;
        "游戏")
                echo "游戏更有益身体健康"
                 break;
                ;;
        "编程")
                echo "编程有害身体健康"
                 break;
                ;;
        *)
                echo "重新输入"
        esac
done
echo "您的爱好是:${score}"

输出结果如下:

[zhangjiajia@localhost ~]$ sh 10.sh
您的爱好是:
1) 打球
2) 游戏
3) 编程
#? 3
编程有害身体健康
您的爱好是:编程
相关推荐
叫我龙翔22 分钟前
【计网】实现reactor反应堆模型 --- 多线程方案优化 ,OTOL方案
linux·运维·网络
mit6.82423 分钟前
[Docker#9] 存储卷 | Volume、Bind、Tmpfs | -v/mount | MySQL 灾难恢复 | 问题
linux·运维·docker·容器·架构
Z1eaf_complete26 分钟前
Docker的基础使用
运维·docker·容器·云计算
WangYaolove131441 分钟前
请解释Python中的装饰器是什么?如何使用它们?
linux·数据库·python
群联云防护小杜1 小时前
服务器被挂马怎么办?——解决服务器被挂马的方法和步骤
运维·服务器·网络协议·tcp/ip·安全·ddos
明志致远淡泊宁静1 小时前
记录一次服务器redis被入侵
运维·服务器·redis
Jtti1 小时前
Jtti:服务器总是自动重启怎么办?
运维·服务器
我是黄大仙1 小时前
利用飞书多维表格自动发布版本
运维·服务器·数据库·飞书
7yewh1 小时前
嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
linux·arm开发·驱动开发·嵌入式硬件·物联网·智能手机·硬件架构
YRr YRr2 小时前
ubuntu ros 解决建完图后 保存的地图非常小的问题
linux·运维·ubuntu