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
编程有害身体健康
您的爱好是:编程
相关推荐
.生产的驴10 分钟前
Docker 消息队列RabbitMQ 安装延迟消息插件
运维·spring boot·后端·docker·容器·rabbitmq·java-rabbitmq
霸道流氓气质24 分钟前
CentOS上使用Mosquitto实现Mqtt主题消息发布和订阅mqtt主题消息连同时间戳记录到文件
linux·运维·mqtt·centos·mosquitto
高危型26 分钟前
CentOS 入门
linux·运维·centos
mit6.82429 分钟前
[Linux#49][UDP] 2w字详解 | socketaddr | 常用API | 实操:实现简易Udp传输
linux·网络·c++·笔记·后端
桃花岛主7040 分钟前
Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程
运维·服务器·nginx
醉卧雕龙舫 、1 小时前
Linux中安装maven
linux·运维·maven
不悔哥1 小时前
openwrt wsdd模块介绍
linux·c语言·网络·tcp/ip·智能路由器
IT枫斗者1 小时前
集合工具类
java·linux·数据库·windows·算法·microsoft
鲸鱼姐1 小时前
在linux注册服务并开机启动springboot程序
linux·运维·服务器
jyan_敬言2 小时前
虚拟机centos_7 配置教程(镜像源、配置centos、静态ip地址、Finalshell远程操控使用)
linux·运维·服务器·c语言·数据结构·tcp/ip·centos