目录
前言:
在 Shell 编程里,循环语句是极为关键的工具,它为处理重复性任务带来了极大的便利。在实际的编程工作中,你常常会碰到需要多次执行相同操作的情况,像批量处理文件、遍历列表中的元素、循环执行某个命令直至满足特定条件等。要是没有循环语句,每次执行这些操作都得手动重复代码,这不仅效率低下,还容易出错。
循环语句能够让你编写一段代码,然后依据特定的规则多次执行它,从而显著提升代码的复用性与效率。Shell 中提供了多种循环语句,例如for
循环、while
循环和until
循环,每一种循环语句都有其独特的使用场景与优势。掌握这些循环语句的使用方法,能够让你更加高效地编写 Shell 脚本,处理各种复杂的任务。接下来,让我们一起深入学习 Shell 编程中的循环语句吧。
一:for循环语句
在 Shell 编程里,for
循环是一个常用的控制结构,它的用途是对一系列的值进行遍历,并且针对每个值执行特定的命令集。
1.for语句结构
这是 Shell 中最常用的 for
循环结构,主要用于遍历列表中的元素。
命令格式:
for 变量名 in 值列表 do 命令序列 done
结构解释
-
for
:这是循环的起始关键字,表明接下来要定义一个for
循环。 -
变量名:在每次循环迭代时,
值列表
中的元素会依次赋值给这个变量。你可以使用任意合法的变量名,一般会选择与循环处理内容相关的名称,方便代码理解。 -
in
:用于分隔变量名和值列表,表明后面跟随的是要遍历的值列表。 -
值列表:可以是由空格分隔的一系列值,也可以是数组、命令替换的结果等。例如,
"apple" "banana" "cherry"
、$(seq 1 5)
等。 -
do
:表示循环体的开始,之后的命令序列
就是每次循环要执行的操作。 -
命令序列:可以包含一个或多个 Shell 命令,用于对每次循环中变量的值进行处理。
-
done
:标志着循环体的结束。
2.for语句应用实例
#创建一个员工列表,并给它设置密码并创建出来
[root@localhost ~]# vim user.txt #创建员工名单
zhangsan
lisi
wangwu
[root@localhost ~]# vim usadd.sh #添加用户的脚本
#!/bin/bash
ulist=$(cat /root/user.txt)
for uname in $ulist
do
useradd $uname
echo "12456" | passwd --stdin $uname &> /dev/null
done
[root@localhost ~]# tail -3 /etc/passwd #确认结果
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#如果想要删除用户,可以使用以下的脚本
[root@localhost ~]# vim usadd.sh #添加用户的脚本
#!/bin/bash
ulist=$(cat /root/user.txt)
for uname in $ulist
do
userdel -r $uname &>/dev/null
done
二:while循环语句
常见使用场景
-
用户交互:在需要不断与用户进行交互,直到满足特定条件才停止的场景中使用,例如让用户输入密码,直到输入正确为止。
-
监控任务:持续监控某个系统状态或者文件内容,当状态改变或者文件内容符合特定条件时执行相应操作。
-
处理未知数量的数据:当需要处理的数据数量不确定时,可以使用
while
循环不断读取数据,直到数据读取完毕。
1.while语句的结构
while 条件测试 do 命令序列 done
结构解释
-
while
:while
循环的起始关键字,表明接下来要定义一个while
循环。 -
条件测试:这是一个命令或者表达式,用于判断循环是否继续执行。通常使用
test
命令(可简写为方括号[ ]
)或者双括号(( ))
进行算术测试,也可以使用其他命令的返回状态码来判断。如果条件测试的返回状态码为 0(表示真),则执行循环体;否则,退出循环。 -
do
:表示循环体的开始,之后的命令序列
就是每次循环要执行的操作。 -
命令序列:可以包含一个或多个 Shell 命令,用于实现具体的功能。
-
done
:标志着循环体的结束。
2.while语句应用实例:
#写一个猜商品价格的脚本
[root@localhost ~]# vim aaa.sh
#!/bin/bash
price=$(expr $RANDOM % 1000)
times=0
echo "请输入商品价格,猜猜看多少?"
while true
do
read -p "请输入你猜测的数:" INT
let times++
if [ $INT -eq $price ]
then
echo "恭喜你猜对了,价格为$price"
echo "你总共猜了$times 次"
exit 0
elif [ $INT -gt $price ]
then
echo "太高了"
else
echo "太低了"
fi
done
[root@localhost ~]# bash aaa.sh #验证结果
请输入商品价格,猜猜看多少?
请输入你猜测的数:500
太低了
请输入你猜测的数:750
太高了
请输入你猜测的数:650
太高了
请输入你猜测的数:575
太低了
请输入你猜测的数:600
太低了
请输入你猜测的数:625
太低了
请输入你猜测的数:630
太低了
请输入你猜测的数:645
太高了
请输入你猜测的数:640
太高了
请输入你猜测的数:635
恭喜你猜对了,价格为635
你总共猜了10 次
三:until循环语句
常见使用场景
-
等待特定条件达成:例如等待某个服务启动成功、某个文件生成完成等。
-
重试机制:在某个操作失败时,不断重试,直到操作成功。
1.until结构
until 条件测试 do 命令序列 done
结构解释
-
until
:until
循环的起始关键字,表明接下来要定义一个until
循环。 -
条件测试:这是一个命令或者表达式,用于判断循环是否继续执行。如果条件测试的返回状态码为非零(表示假),则执行循环体;当条件测试的返回状态码为 0(表示真)时,退出循环。通常使用
test
命令(可简写为方括号[ ]
)或者双括号(( ))
进行算术测试,也可以使用其他命令的返回状态码来判断。 -
do
:表示循环体的开始,之后的命令序列
就是每次循环要执行的操作。 -
命令序列:可以包含一个或多个 Shell 命令,用于实现具体的功能。
-
done:标志着循环体的结束。
2.until实例
#写一个shell脚本,用于给已登录的用户发送信息,对用户进行检测,必须是系统内用户且处于登录的状态,通过linux的write命令发送消息
[root@localhost ~] vim send_message.sh
#!/bin/bash
# 检查输入参数是否为两个
if [ $# -ne 2 ]; then
echo "用法: $0 <用户名> <消息>"
exit 1
fi
username=$1
message=$2
# 检查用户是否存在于系统中
if ! id "$username" &> /dev/null; then
echo "用户 $username 不存在于系统中。"
exit 1
fi
# 检查用户是否已登录
if ! who | grep -q "$username"; then
echo "用户 $username 未登录。"
exit 1
fi
# 向用户发送消息
write "$username" <<< "$message"
if [ $? -eq 0 ]; then
echo "消息已成功发送给 $username。"
else
echo "发送消息给 $username 时出错。"
fi
#验证结果
[root@localhost ~]# ./send_message.sh root hell0
write: root 登录了多次;将记入 pts/0
消息已成功发送给 root。
[root@localhost ~]# ./send_message.sh zhangsan hell0
消息已成功发送给 zhangsan。
总结
该文档围绕 Shell 编程中的循环语句展开,阐述了循环语句在处理重复性任务时能提升代码复用性与效率,详细介绍了for
(用于遍历列表元素,如批量创建或删除用户)、while
(适用于用户交互、监控任务和处理未知数量数据,如猜商品价格脚本)、until
(用于等待特定条件达成或重试机制,如给已登录用户发送消息脚本)三种循环语句的结构、使用场景及应用