shell脚本—循环语句

循环语句

echo命令:标准输出或提取shell变量的值

  • 标准输出
[root@localhost ~]#echo 123456|passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
  • 提取shell变量的值
echo -n   表示不换行输出
echo -e   表示输出转义符

常用转义符

转义符说明
\b表示退格,不显示前一个字符
\c抑制更多的输出或不换行
\f换行,但光标仍停留在原处
\n换行
\r回车
\t横向制表符
\v纵向制表符
\\反斜杠
[root@localhost data]#echo -e "1234\b567"
123567
[root@localhost data]#echo -e "1234\b\b567"
12567
[root@localhost data]#echo -e "1234\b\b\b567"
1567
[root@localhost data]#echo -e "1234567\c"
1234567[root@localhost data]#
[root@localhost data]#echo -e "123\c4567"
123[root@localhost data]#

image-20240125135525354

date

  • date查看当前系统时间
选项说明
-d描述的日期,显示指定字符串所描述的时间,而非当前时间
%F完整日期格式,等价于 %Y-%m-%d
%T时间(24小时制)(hh:mm:ss)
[root@localhost data]#date
2024年 01月 25日 星期四 14:02:14 CST
[root@localhost data]#date -d '-1 day' +%F
2024-01-24
[root@localhost data]#date -d '1 day' +%F
2024-01-26
[root@localhost data]#date +%F
2024-01-25
##%F 与 %T之间要用分隔符隔开
[root@localhost data]#date -d '1 day' +%F-%T
2024-01-26-14:03:52
[root@localhost data]#date -d '1 day' +%F'  '%T
2024-01-26  14:04:38

##查看日历
[root@localhost data]#cal 11 2000
     十一月 2000
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

crontab里不能有"%"号,要用转义符"\"
30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`
30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 

image-20240125141541714

seq

  • 打印列表
#从1开始,10停止,间隔为2打印(显示1到10的奇数)
[root@localhost data]#seq 1 2 10
1
3
5
7
9
#从1开始,10停止打印(显示1到10的数)
[root@localhost data]#seq 1 10
1
2
3
4
5
6
7
8
9
10
#从0开始,10停止,间隔为2打印(显示0到10的偶数)
[root@localhost data]#seq 0 2 10
0
2
4
6
8
10

image-20240125142348670

循环含义

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件

重复运行次数

  • 循环次数事先已知
  • 循环次数事先未知

常见的循环的命令:for, while, until

for:一般用于已知次数(事先已知)

while,和until:一般用于已知条件(事先未知)

1、for

语法结构

  • 列表循环
  • 不带列表循环
  • 类C风格的for循环

语法格式

for 变量名 in   {list}
do
    命令序列
done
##1到100的求和
[root@localhost data]#vim ww.sh
#!/bin/bash
#1到100的求和
sum=0
for i in {1..100}
do
sum=$[i+sum]
done
echo "求和结果是$sum"

#1到100的奇数求和
sum=0
for i in {1..100..2}
do
let sum+=$i
done
echo "奇数和为$sum"

#1到100的偶数求和
sum=0
for i in {0..100..2}
do
let sum+=$i
done
echo "偶数和结果为$sum"

[root@localhost data]#bash ww.sh
求和结果是5050
奇数和为2500
偶数和结果为2550

image-20240125160533188

##批量添加用户,用户名存放在name.txt文件中,一行放一个用户名,初始密码均设为123456
[root@localhost data]#vim name.txt
qiyi
qier
qisan
qisi
qiwu
qiliu
qiqi

[root@localhost data]#vim .qwe.sh
#!/bin/bash
for i in `cat /data/name.txt`
do
useradd $i
echo 123456|passwd --stdin $i
done

[root@localhost data]#bash .qwe.sh
useradd:用户“qiyi”已存在
更改用户 qiyi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qier”已存在
更改用户 qier 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qisan”已存在
更改用户 qisan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qisi”已存在
更改用户 qisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiwu”已存在
更改用户 qiwu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiliu”已存在
更改用户 qiliu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
useradd:用户“qiqi”已存在
更改用户 qiqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

image-20240125162425413

image-20240125170410723

##ping192.168.10.0/24网段
[root@localhost data]#vim xx.sh
#!/bin/bash
for i in {1..254}
do
{
ping -c2 -w2 192.168.10.$i &>/dev/null && echo "$i is online" >> /data/hostonline.txt  || echo "$i is offline" >> /data/hostoffline.txt
} &
done

[root@localhost data]#ls
hostoffline.txt  hostonline.txt
[root@localhost data]#cat hostonline.txt
1 is online
2 is online
11 is online
1 is online
11 is online
2 is online
[root@localhost data]#cat hostoffline.txt
10 is offline
5 is offline
8 is offline
3 is offline
13 is offline
12 is offline
15 is offline
16 is offline
17 is offline
20 is offline
21 is offline
23 is offline
26 is offline
27 is offline
……

image-20240125181555829

2、while

相对于for,需要知道循环次数,当我们只知道停止条件,不知道次数,就需要使用while,直到达到条件

while循环

while循环一般用于有条件判断的循环,若判断条件成立,则进入循环,当条件不成立就跳出循环

  • 语法结构
while 条件判断
do
 命令序列
done
  • 死循环

    while写一个永远为真 的条件

    while true

    while :

##1到100的求和
[root@localhost data]#vim yu.sh
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
#跳出条件(执行一次循环,i自动加1)
done
echo $sum

[root@localhost data]#bash yu.sh
5050

image-20240125171424259

##新建用户以stu开头,按数字排序1到20.初始密码是123456
[root@localhost data]#vim add.sh
#!/bin/bash
a=1
while [ $a -le 20 ]
do
useradd stu$a
echo 123123|passwd --stdin stu$a  &>/dev/null
let a++
done

[root@localhost data]#bash add.sh
[root@localhost data]#tail -f /etc/passwd
stu11:x:1019:1019::/home/stu11:/bin/bash
stu12:x:1020:1020::/home/stu12:/bin/bash
stu13:x:1021:1021::/home/stu13:/bin/bash
stu14:x:1022:1022::/home/stu14:/bin/bash
stu15:x:1023:1023::/home/stu15:/bin/bash
stu16:x:1024:1024::/home/stu16:/bin/bash
stu17:x:1025:1025::/home/stu17:/bin/bash
stu18:x:1026:1026::/home/stu18:/bin/bash
stu19:x:1027:1027::/home/stu19:/bin/bash
stu20:x:1028:1028::/home/stu20:/bin/bash

image-20240125183534562

##猜商品价格,通过变量RANDOM获得随机数,提示用户猜测并记录次数,猜中后退出
[root@localhost data]#vim qi.sh
#!/bin/bash
a=`echo $[RANDOM%1000+1]`
time=0
while :
do
read -p "请输入商品的价格(1-1000):" h
let time++
#统计猜测的次数
if [ $a -eq $h ];then
echo "恭喜你,猜中了,商品价格是${h};你一共猜了${time}次"
exit
#跳出循环
elif [ $a -gt $h -a $h -le 1000 -a $h -gt 0 ];then
echo "你猜的价格过低"
elif [ $a -lt $h -a $h -le 1000 ];then
echo "你猜的价格过高"
else
echo "输入有误,请重新输入"
fi
done

[root@localhost data]#bash qi.sh
请输入商品的价格(1-1000):100
你猜的价格过低
请输入商品的价格(1-1000):1000
你猜的价格过高
请输入商品的价格(1-1000):45620
输入有误,请重新输入
请输入商品的价格(1-1000):450
你猜的价格过高
请输入商品的价格(1-1000):1\186
输入有误,请重新输入
请输入商品的价格(1-1000):186
你猜的价格过低
请输入商品的价格(1-1000):270
恭喜你,猜中了,商品价格是270;你一共猜了7次

image-20240125191322887

3、until

until 循环与 while 循环类似,while 循环能实现的脚本 until 同样也可以实现,但区别是while 循环在条件为真是继续执行循环,而 until 则是在条件为假时执行循环

until 循环语句的语法结构如下所示。

until 条件测试操作
do
 命令序列
done
##1到100的求和
[root@localhost data]#vim zx.sh
#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
let sum=$i+$sum
let i++
done
echo sum=$sum

[root@localhost data]#bash zx.sh
sum=5050

image-20240125203404908

4、双重循环及跳出循环

  • break跳出单个循环 break n 数字(数字是几,代表跳出n层循环)
  • continue终止某次循环中的命令,但是不会完全终止命令
  • exit 直接退出脚本
  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值