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
编程有害身体健康
您的爱好是:编程
相关推荐
AlfredZhao16 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理