AUTHOR:闫小雨
TIME:2024-05-10
目录
一、for循环语句
1、for语句结构
for循环的运作方式,是将列表的元素一一取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do
和done
之间),直到所有元素取尽为止。其中,列表是一些字符串的组合,彼此用分隔符(如空格符)隔开,这些字符串称为字段。
for 变量名 in 列表; do
循环体,即需要重复执行的命令
done
或
for 变量 in 列表
do
循环体,即需要重复执行的命令
done
使用场景
for 循环适用于需要遍历一个列表(如数组、文件列表、字符串列表等)并对每个元素执行相同操作的场景中。它允许指定一个元素列表,并逐个取出列表中的元素,对每个元素执行相应的代码块。通过使用 for 循环,可以轻松地处理列表中的每个元素,无需手动编写重复的代码,提高了脚本的效率和可读性。
执行机制
- 依次将列表中的元素赋值给“
变量名
” ; 每次赋值后即执行一次do
和done
之间的循环体; 直到列表中的元素耗尽,循环结束。
列表生成方式
- 直接给出列表
- 整数列表:
{start..end}, $(seq [start [step]] end)
- 返回列表的命令:
$(COMMAND)
- 使用glob通配符,如:
*. sh
- 变量引用
注意:
- for循环的取值列表中使用空格、制表符(tab)、换行符或其他空白字符来进行取值之间的分隔。
- 在Shell脚本里 for 循环和 while 循环中,位于
do
和done
关键字之间的命令序列被称为循环体。
优缺点
优点
-
- 明确且简洁:for循环清晰地定义了循环的初始值、条件和更新步骤,使代码更易于阅读和理解。
- 可控性强:通过设定条件,可以精确控制循环的执行次数。
- 高效:适合执行固定次数的循环操作。
缺点
-
- 灵活性有限:相比while循环,for循环在动态改变循环条件方面较为受限。
- 可读性挑战:复杂的for循环可能降低代码可读性。
- 潜在风险:不当的循环条件或变量更新可能导致无限循环。
- 资源消耗:在迭代次数多或操作复杂时,可能消耗较多资源。
流程图
2、for循环语句应用示例
实例1:列出循环次数
#!/bin/bash
echo TIME:2024-05-10
echo AUTHOR:'闫小雨'
for i in 1 2 3;do #写了一个变量 “i”,列表写了3个参数,
echo "$i" #打印一下i这个变量的值
done #for循环结束
[root@yanxy502 ~] sh for.sh
TIME:2024-05-10
AUTHOR:闫小雨
1
2
3
实例2:创建文件夹
#!/bin/bash
# TIME:2024-05-10
# AUTHOR:'闫小雨'
for k in $(seq 1 10)
do
mkdir /home/yanxiaoyu/aaa${k} # 在/home/yanxiaoyu/目录下创建文件夹aaa${k}
cd /home/yanxiaoyu/aaa${k}
for l in $(seq 1 10)
do
mkdir bbb${l} # 在aaa${k}目录下创建文件夹bbb${l}
done
cd ..
done
[root@yanxy502 ~] vim for.sh
[root@yanxy502 ~] sh for.sh
[root@yanxy502 ~] ls /home/
Test yanxiaoyu
[root@yanxy502 ~] ls /home/yanxiaoyu/
aaa1 aaa10 aaa2 aaa3 aaa4 aaa5 aaa6 aaa7 aaa8 aaa9
二、While循环语句
1、while语句结构
while循环用于重复执行一段代码,直到指定的条件不再满足为止。
#当条件测试成立(条件测试为真),执行循环体
while [ 条件测试 ]
do
循环体,即需要重复执行的命令
done
或
while 条件测试
do
循环体,即需要重复执行的命令
done
使用场景
while循环用于重复执行一段代码,直到指定的条件不再满足为止的场景中。它常用于处理需要迭代执行的任务,如遍历文件列表、按次数执行操作、等待用户输入等,直到满足特定的退出条件为止。通过 while 循环,可以方便地控制代码块的重复执行次数和条件。
执行机制
只要指定的条件为真,就重复执行循环体内的代码,直到条件不再满足为止。
优缺点
优点
-
- 灵活性强:while循环可以根据任意条件来重复执行代码块,可以基于复杂的逻辑或外部输入来决定循环是否继续。
- 清晰直观:while循环的结构清晰明了,容易理解。通常包括一个条件判断和一个循环体,条件判断决定循环是否继续执行,而循环体包含需要重复执行的代码。
- 适合处理未知次数的迭代:当循环的迭代次数不确定时,它可以根据条件来动态地决定循环的次数。
缺点
- 无限循环的风险:如果没有正确设置退出条件,while循环可能会变成无限死循环,导致程序无法停止或响应,可能会消耗大量资源或导致系统崩溃。
- 依赖外部条件:while循环的执行依赖于外部条件的变化。如果外部条件没有按预期变化,循环可能会永远继续下去成为死循环,从而导致程序逻辑错误或性能问题。
- 需要谨慎处理条件判断:在使用while循环时,需要特别注意条件判断的逻辑和准确性。如果条件判断有误,可能会导致循环无法正常执行或产生不可控制的结果。
流程图:
2、while循环语句应用示例
实例1:倒计时
#!/bin/bash
#TIME 2025-05-10
#AUTHON "闫小雨"
# 读取用户输入的倒计时秒数
read -p "请输入倒计时秒数(正整数): " COUNTDOWN
# 检查输入是否为正整数
if ! [[ $COUNTDOWN =~ ^[0-9]+$ ]]; then
echo "错误:请输入一个正整数作为倒计时秒数。"
exit 1
fi
# 开始倒计时循环
while [ $COUNTDOWN -gt 0 ]; do
echo -ne "$COUNTDOWN\r" # \r 用于回显到同一行
sleep 1
((COUNTDOWN--))
done
echo "倒计时结束!"
[root@yanxy502 ~] vim while.sh
[root@yanxy502 ~] sh while.sh
请输入倒计时秒数(正整数): 5
#5 #该数字为变动数字,倒计时从5到0;
#4
#3
#2
#1
倒计时结束!
实例2:猜谜码
定义了一个预设的密码 PASSWORD 和一个空的变量 GUESS 来存储用户的猜测,使用 while 循环来持续读取用户的输入,直到输入与预设的密码匹配,在循环内部,使用 read 命令来读取用户的输入,使用 if 语句来检查用户的猜测是否与预设的密码匹配。如果不匹配,则输出一个错误消息,在每次输出一个错误消息后,使用 echo 命令来输出一个换行符,以便在下一行显示消息或提示,当用户的猜测与预设的密码匹配时,while 循环的条件不再满足,循环结束,最后,输出一个恭喜消息来告诉用户猜对了密码。
#!/bin/bash
# TIME 2025-05-10
# AUTHOR "闫小雨"
PASSWORD="password" # 这是预设的密码
GUESS=""
while [ "$GUESS" != "$PASSWORD" ]; do # 使用 while 循环来持续读取用户的猜测,直到猜测正确
read -p "请输入你的猜测: " GUESS
echo # 使用 echo 打印空白行,显示下一个提示或消息
if [ "$GUESS" != "$PASSWORD" ]; then # 这里再次检查 "$GUESS" != "$PASSWORD",为了清晰可见猜测错误时给出提示
echo "错误!再试一次。"
fi
done
echo "恭喜!你猜对了密码。" # 当猜测正确时,显示恭喜消息
[root@yanxy502 ~] vim while.sh
[root@yanxy502 ~] sh while.sh
请输入你的猜测: abcd
错误!再试一次。
请输入你的猜测: 12345
错误!再试一次。
请输入你的猜测: a1b2c3
错误!再试一次。
请输入你的猜测: password
恭喜!你猜对了密码。
三、case
分支语句
1、case语句结构
case语句用于进行多条件选择。它的语法结构类似于其他编程语言中的 switch 语句。case语句会检查一个变量或表达式的值,并将其与多个模式进行比较。如果找到匹配的模式,就会执行相应的命令序列,直到遇到;;
或esac
( case 的反写)为止。
case 变量 in
模式1)
# 在这里放置命令序列,当变量与模式1匹配时执行
;;
模式2)
# 在这里放置命令序列,当变量与模式2匹配时执行
;;
...
*)
# 默认情况,当变量与任何模式都不匹配时执行
;;
esac
;;
表示当前case分支的结束。当case表达式与某个case标签匹配时,Shell会执行该case分支下的所有命令,直到遇到;;
为止。然后它会跳出当前的case分支,不再继续执行该分支下的后续命令。
使用场景
case分支语句适用于需要基于单个变量的不同值来执行不同操作的场景中。它常用于处理用户输入、命令行参数、配置文件选项等,使得脚本能够根据不同的条件执行相应的代码块
执行机制:
根据传入的字符串与一系列模式进行匹配,并执行匹配到的第一个case标签后的命令,直到遇到;;
或esac
( case 的反写)为止。
优缺点
优点
-
- 结构清晰: case 语句可以使代码更加结构化,因为它允许将不同的处理逻辑分组到不同的分支中。
- 避免冗余:在case语句中,每个条件都对应一个独立的代码块,避免了在多个条件中重复编写相同的代码。
- 易于扩展:当需要添加新的条件时,只需在case语句中添加一个新的分支即可,无需对整个逻辑结构进行重大修改。
- 基于值的选择:case语句根据表达式的值来选择要执行的代码块,这在处理枚举类型或离散值时特别有用。
缺点
- 局限性:case 语句主要基于字符串比较,因此在处理非字符串类型(如整数或浮点数)时可能不太方便。对于复杂的逻辑判断可能不够灵活。
- 不支持复杂逻辑:case语句的每个分支都是独立的,不支持跨分支的逻辑运算或条件组合。
- 默认行为:如果case语句中没有匹配的分支且没有指定默认分支,程序可能不会执行任何操作。
- 可读性:当条件分支过多时,case语句可能会使代码变得冗长和难以阅读。
流程图:
2、case循环语句应用示例
案例1:猜数字
使用read
命令来提示用户输入一个数字,并将输入存储在变量number
中。case
语句用于检查$number
的值,并根据不同的值执行相应的命令序列。使用通配符[4-6]
来匹配4、5或6这三个数字。使用了模式[0-9]*
来匹配任何以数字开头的字符串(这实际上会匹配任何包含数字的字符串,但在这个上下文中,可以假设用户只输入了数字)。*)
是默认情况,用于处理任何不匹配前面任何模式的情况。
#!/bin/bash
# TIME 2025-05-10
# AUTHOR "闫小雨"
# 提示用户输入一个数字
read -p "请输入一个数字(1-3):" number
# 使用case语句来处理用户的输入
case $number in
1)
echo "你输入了数字1"
# 这里可以添加更多的命令来处理数字1的情况
;;
2)
echo "你输入了数字2"
# 处理数字2的情况
;;
3)
echo "你输入了数字3"
# 处理数字3的情况
;;
# 使用通配符来匹配多个值
[4-6])
echo "你输入了4, 5, 或 6之间的数字"
;;
# 使用模式匹配来检查特定的字符串格式
[0-9]*)
echo "你输入了一个数字,但它不在1到3的范围内"
;;
# 使用*)作为默认情况
*)
echo "你输入的不是一个数字,或者输入了非法字符"
;;
esac
[root@yanxy502 ~] vim case1.sh
[root@yanxy502 ~] bash case1.sh
请输入一个数字(1-3):5
你输入了4, 5, 或 6之间的数字
[root@yanxy502 ~]# bash case1.sh
请输入一个数字(1-3):8
你输入了一个数字,但它不在1到3的范围内
[root@yanxy502 ~]# bash case1.sh
请输入一个数字(1-3):y
你输入的不是一个数字,或者输入了非法字符
[root@yanxy502 ~]# bash case1.sh
请输入一个数字(1-3):2
你输入了数字2
案例2:周末快到了
使用read
命令来提示用户输入一个星期,并将输入存储在变量day
中。然后使用case语句来检查day变量的值,并根据不同的值输出不同的消息。如果day
是星期一
,则输出今天是星期一!
。如果day
是星期二
、星期三
、星期四
或星期五
,则分别输出对应的消息。如果day
是星期六
或星期日
,则由于使用了|
逻辑或,这两个模式被视为一个整体,并输出今天是周末!
。如果day的值不匹配任何模式,则执行默认情况*)
,并输出无效的星期几。
。
#!/bin/bash
# TIME 2025-05-10
# AUTHOR "闫小雨"
# 提示用户输入一个数字
read -p "请输入星期 例如 星期一 : " day
# 使用case语句检查day变量的值
case "$day" in
"星期一")
echo "今天是星期一!"
;;
"星期二")
echo "今天是星期二!"
;;
"星期三")
echo "今天是星期三!"
;;
"星期四")
echo "今天是星期四!"
;;
"星期五")
echo "今天是星期五!周末快来了。"
;;
"星期六"|"星期日") # 使用 | 逻辑或来匹配多个模式
echo "今天是周末!"
;;
*)
echo "无效的星期几。"
;;
esac
[root@yanxy502 ~] vim daycase.sh
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期一
今天是星期一!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期二
今天是星期二!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期三
今天是星期三!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期四
今天是星期四!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期五
今天是星期五!周末快来了。
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期六
今天是周末!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 星期日
今天是周末!
[root@yanxy502 ~] bash daycase.sh
请输入星期,例如'星期一' : 123
无效的星期几。