目录
一、循环语句
1.echo命令
2.date
二、for
1.列表循环
2.不带列表循环
3.类似c语言的for循环
4.实战
三、while
1.continue跳出循环
2.break跳出循环
四、实操脚本实例
1.循环打印9*9乘法表
2.循环ping厕所某个网段网络连通性
3.while死循环实现猜数字游戏
将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数
循环次数事先已知
循环次数事先未知
常见的循环的命令:for, while, until
echo -n 表示不换行输出
echo -e 表示输出转义符
常用的转义符
选项 | 作用 |
\r | 光标移至行首,并且不换行 |
\s | 当前shell的名称,如bash |
\t | 插入Tab键,制表符 |
\n | 输出换行 |
\f | 换行,但光标仍停留在原处 |
\ | 表示插入“\"本身转义 |
\b | 表示退格,不显示前一个字符 |
\c | 抑制更多的输出或不换行 |
[root@localhost ky15]#echo -e "12345\b678"
##退格删除前面的字符
1234678
[root@localhost ky15]#echo -e "12345\b\b678"
123678
[root@localhost ky15]#echo -e "12345\b\b\b678"
12678
[root@localhost ky15]#echo -e "12345\b\b\b\b678"
16785
###注意退格键和末尾的字符相关,超过末尾的字符数量 会出bug 了解即可
[root@localhost ky15]#echo -e "12345678\c"
12345678
[root@localhost ky15]#echo -e "1234\c5678"
1234
###\c 注意 使用在数字中间会把后面内容删除
echo -e "n\n\n\n\n\nw"|fdisk /dev/sdb
#自动硬盘分区
#!/bin/bash
read -p "请输入你要分区的设备:" disk
read -p "请输入你要分区的大小:" num
echo -e "n\n\n\n\n${num}\nw\n " | fdisk ${disk}
date查看当前系统时间
-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F 完整日期格式,等价于 %Y-%m-%d
% T 时间(24小时制)(hh:mm:ss)
[root@localhost ~]# date -d '-1 day' +%F
2021-10-21
[root@localhost ~]# date +%F
2021-08-19
[root@localhost ~]# date -d '1 day ' +%F-%T
2021-08-20-23:28:42
[root@localhost mnt]# date -d "-3 day" 前三天
2021年 08月 18日 星期三 11:30:15 CST
[root@localhost mnt]# date -d "+3 day" 后三天
2021年 08月 18日 星期三 11:30:15 CST
[root@localhost data]#date -d '1 day ' +%F' '%T
2021-10-22 00:45:37
日历
[root@localhost data]#cal 2021
#查看日历
[root@localhost data]#cal 9 1752
九月 1752
日 一 二 三 四 五 六
1 2 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’`
语法:
for 变量名 in {list}
do
command
done
{ }的用法
花括号{}和seq在for循环的应用:
for i in {1..50..2} 1-50的奇数
for i in {2..50..2} 1-50的偶数
for i in {10..1} 1-10倒序排列
for i in $(seq 10) 1-10正序排列
for i in $(seq 10 -1 1) 1-10倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
语法:
for 变量名
do
command
done
例子:打印xuzhou
[root@server ~]# vim for2.sh
#!/bin/bash
for i
do
echo xuzhou
done
[root@server ~]# . for2.sh
#没有给脚本传参所以执行了没有结果
[root@server ~]# . for2.sh a
#把a赋值给变量i,i有值了它就开始执行do..done了
xuzhou
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
sum+=i 等于 sum=sum+i
#需要使用 let 命令
++ 自身变量+1
-- 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量*5
/=5 自身变量/5
%=5 自身变量%5
举例:
vim a.sh
脚本内容:
#!/bin/bash
for(( i=0;i<=5;i++ )) #定义for循环i变量初始值为0,循环条件i小于等于5,每循环一次i自加1
do
echo "$i" #for循环每循环一次执行一次输出$i
done #for语句结束标志
bash a.sh #调用shell执行脚本
输出结果:
0
1
2
3
4
5
while循环 1、语法结构 2、死循环
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
格式:
while [ 判断条件] 使用while循环满足条件执行do,不满足不执行
do
执行动作 while循环执行动作
done while循环结束标志
死循环语句:
①while [1 -eq 1] 判断条件写一个永久为真的条件
do 一直执行do内的命令
done
②while true 直接写判断条件为真
do 一直执行do内的命令
done
③while : 判断条件为冒号也表示死循环
do 一直执行do内的命令
done
1.continue跳出循环
表示满足continue条件时跳出循环,但是不影响后续循环执行
举例:
vim a.sh #创建脚本a.sh
脚本内容:
#!/bin/bash
for i in {1..5} #for循环5次从i=1开始到i=5
do
if [ $i -eq 3 ] #if判断语句,若$1等于3则执行then的内容
then
continue #当$i=3时跳出循环但不影响后面循环
fi #结束if语句
echo "$i" #没执行一次for循环输出一次$i
done #for循环结束语句
bash a.sh #调用shell执行脚本
输出结果
1
2
4
5
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环
举例:
vim a.sh #创建a.sh脚本
脚本内容:
#!/bin/bash
for j in {1..3} #第一层for循环,j=1,2,3各执行一次do的内容
do #第一层for循环的执行内容
for i in {1..5} #第二层for循环,i=1,2,3,4,5各执行一次do的内容
do #第二层for循环的执行内容
if [ $i -eq 3 ] #第二层for循环中添加的if判断语句,当$i=3是执行then内容
then
break #第二层for循环判断语句执行命令,break结束循环
fi #if语句结束
echo "$i" #第二层for循环语句执行每循环一次输出$i
done #第二层for循环语句结束标志
done #第一层for循环语句结束标志
bash a.sh #调用bash执行a.sh脚本
执行结果:第二层执行在$i=3是结束了循环,所以只能输出1和2,第一层for循环是循环3次,所以输出了3次。
1
2
1
2
1
2
9*9乘法表
第一步:
vim 99.sh #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9} #for循环9次从i=1开始
do
echo -n "*" #每循环一次打印一个*,echo -n参数表示不换行
done #此for循环语句结束
bash 99.sh #调用shell执行脚本
执行结果:
*********
第二步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for j in {1..9} #添加打印列循环,循环9次从j=1开始
do #j循环时做do中的内容
for i in {1..9} #第一步for循环内容不变
do
echo -n "*"
done
echo #列循环每循环一次打印一行空格进行换行
done #列循环for语句结束标志
bash 99.sh #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
第三步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for j in {1..9} #列循环内容不变
do
for i in `seq $j` #修改行循环i的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当
j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
do
echo -n "*"
done
echo
done
bash 99.sh #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********
第四步:
vim 99.sh #编辑99.sh脚本
脚本内容:
#!/bin/bash
for j in {1..9} #列循环内容不变
do
for i in `seq $j`
do
echo -ne "$j*$i=$[ $j*$i ]\t" #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结
果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
done
echo
done
bash 99.sh #调用shell执行脚本
输出结果:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
vim ping.sh #创建ping.sh脚本
脚本内容:
#!/bin/bash
read -p "请输入需要测试的网段,格式为(192.168.30.):" ip #读取用户输入内容为变量ip
for i in {1..254} #for循环254次,从i=1开始
do
{ #将{}内容当成一个整体
ping -c2 -w2 $ip$i &>/dev/null #指定ping包为2个超时结束时间为2秒且将产生的内容全部放入null垃圾桶中,&符号表示错误输出也放入null垃圾桶中
if [ $? -eq 0 ] #if条件判断如果上一个循环执行的命令是正确的则$?返回0,若等于0执行then的内容
then
echo "$ip$i is online" #if条件成立执行打印
echo $ip$i >> host.txt #将if条件成立的ip追加到host.txt文件中
else
echo "$ip$i is offline" #if添加判断不成立执行打印
fi
}& #将循环成立的内容放入后台执行
done
wait #执行结束不等待直接退出
vim game.sh #创建脚本game.sh
脚本内容:
#!/bin/bash
num=`echo $[ RANDOM%100+1 ]` #$[RANDOM]是一个0-32767的随机数,%100+1除100取余+1表示生成0-100随机数
time=0 #定义猜对次数变量time初始值为0
while true #生成while死循环
do #循环动作为do内的内容
let time++ #每循环一次time变量自加1
read -p "请输入您猜测的数字,范围(1-100):" user #读取用户输入的内容为变量user
if [ $user -eq $num ] #条件判断分支1,如果用户输入等于随机生成执行then动作
then
echo "您猜对了,您一共猜测了$time次" #if分支1条件成立执行输出
break #if分支1条件成立则结束本次循环
elif [ $user -gt $num ] #条件判断分支2,如果用户输入大于随机生成执行本次then动作
then
echo "您猜大了,请往小猜" #条件判断分支2成立提示用户猜大了
elif [ $user -lt $num ] #条件判断分支3,如果用户输入小于随机生成执行本次then动作
then
echo "您猜小了,请往大猜" #条件判断分支3成立提示用户猜小了
fi #if语句结束
done
bash game.sh #调用bash执行脚本
执行结果
请输入您猜测的数字范围(1-100):50
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):60
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):70
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):65
您猜大了,请往小猜
请输入您猜测的数字范围(1-100):62
您猜小了,请往大猜
请输入您猜测的数字范围(1-100):63
恭喜您猜对了,您一共猜了6次