宝贝,我半夜在输液,输的是想你的夜(循环语句for,while,until附带date,含案例),

Posted ‘朱砂痣’、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了宝贝,我半夜在输液,输的是想你的夜(循环语句for,while,until附带date,含案例),相关的知识,希望对你有一定的参考价值。

五、循环语句

5.1、for循环

5.1.1、列表循环结构(含案例)
for 变量 in(列表)
do
循环体 (命令集合)
done
for 变量 in  var1 var2 var3
do
循环体
done
for i in {1..5};do echo $i;done
for i in {5..1}; do  echo $i; done
for i in {1..5..2};do echo $i;done
for i in {5..1..-2}; do echo $i; done
for i in {5..1..2}; do echo $i; done
for i in `seq 1 2 5` ;do echo $i; done ##``是英文输入法下的反撇号
for i in $(seq 1 2 5); do echo $i ;done
for i in `seq 5 -2 1`; do echo $i; done
for i in $(seq 5 -2 1); do echo $i; done

下面是for的列表循环的一些语法结构

  • [ ]

  • for i in {1…5} 数字由小到大

for i in {1..5};do echo $i;done

在这里插入图片描述

  • for i in {5…1}数字由大到小

    代码:

 for i in {5..1}; do  echo $i; done

在这里插入图片描述

  • for i in {1…5…2}步长是2:从1到5,每次增加2

代码:

for i in {1..5..2};do echo $i;done

在这里插入图片描述

  • for i in {5…1…2}从5开始输出,到1结束,每次减小2

代码:

for i in {5..1..-2}; do echo $i; done
 for i in {5..1..2}; do echo $i; done

在这里插入图片描述

  • [ ]

  • for i in seq 1 2 5,以及==for i in $(seq 1 2 5)==

代码:

for i in `seq 1 2 5` ;do echo $i; done ##``是英文输入法下的反撇号
#################
for i in $(seq 1 2 5); do echo $i ;done

在这里插入图片描述

  • for i in seq 5 -2 1,以及==for i in $(seq 5 -2 1)==

注意:for i in seq 5 2 1,以及for i in $(seq 5 2 1)写法是错误的,这也是和{5…1…2}的不同之处

代码:

for i in `seq 5 -2 1`; do echo $i; done
for i in $(seq 5 -2 1); do echo $i; done

在这里插入图片描述

在这里插入图片描述

  • [ ]

  • == for i in 1 2 3 4 5==

代码:

for i in 1 2 3 4 5 do echo $i ;done

在这里插入图片描述

5.1.2、不带列表循环结构(含案例)

循环次数由用户指定参数以及参数的个数由,脚本后面的参数决定

格式:

#!/bin/bash
for i 
   do
      cmd
      cmd
      cmd
      ...
   done
   然后保存退出编辑状态
   运行脚本后面加参数

案例1:输出三个参数

#!/bin/bash
for i
do
    echo $i
done
##############
sh test2.sh 10 20 30
输出结果:
10
20 
30

在这里插入图片描述

5.1.3、类C风格for循环(含案例)
for((表达式1;表达式2;表达式3))
do
cmd
cmd
...
done

for (( i=1;i<=5;i++))
	do
		echo $i
	done
	
表达式1:定义变量并赋初值
表达式2:决定是否进行循环(条件)
表达式3:决定循环变量如何改变,决定循环什么时候退出
i++:等同于i=i+1
i--:等同于i=i-1
i+=2:等同于i=i+2
i-=2:等同于i=i-2
let sum=sum+$i:等同于sum=$[$sum+$i]

案例1:输出1到5

for ((i=1;i<=5;i++)); do echo $i; done

在这里插入图片描述

案例2:计算1到100的奇数之和

  • 列表for循环
##############################第一种方法
#!/bin/bash
sum=0
for i in {1..100..2}
do
  sum=$[ $i + $sum ]
done
echo "1-100的奇数和是:$sum"
#################################第二种方法
#!/bin/bash
sum=0
for i in $(seq 1 2 100)
do
  sum=$[ $i + $sum ]
done
echo "1-100的奇数和是:$sum"
###############################
#!/bin/bash
sum=0
for i in `seq 1 2 100`
do
  sum=$[ $i + $sum ]
done
echo "1-100的奇数和是:$sum"

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 类c风格
######################第三种方法
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
 # sum=$[ $i + $sum ]
 #  let sum=$sum+$i
 #  let sum=sum+$i
    let sum=sum+i
done
echo "1-100的奇数和是:$sum"

let sum=sum+i

在这里插入图片描述

let sum=sum+$i

在这里插入图片描述

let sum= s u m + sum+ sum+i:=这边显示不出来sum以及i左面的$符号

在这里插入图片描述

== sum=$[ $i + $sum ]==

在这里插入图片描述

  • for循环和if组合使用
################第四种方法
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    if [ $[$i%2] -ne 0 ];then
    let sum=sum+$i
    fi
done
echo "1-100的奇数和是:$sum"

#########################
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
    test $[$i%2] -ne 0 && let sum=sum+i
done
echo "1-100的奇数和是:$sum"

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 补充:continue
##################方法五
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
if [ $[$i%2] -eq 0 ];then
continue
else
 let sum=sum+i
fi
done
echo "1-100的奇数和是:$sum"
############################
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
test $[$i%2] -eq 0 && continue || let sum=sum+$i
done
echo "1-100的奇数和是:$sum"

在这里插入图片描述

在这里插入图片描述

扩展:continue ,break,exit

循环体:do...done之间的内容
continue:继续;表示循环体内下面的代码不执行,重新开始下一次循环
break:打断;马上停止执行本次循环,执行循环体后面的代码
exit:表示直接跳出程序
  • break演示

在这里插入图片描述

案例3:批量添加用户

代码:

#! /bin/bash
read -p "输入你要查找的用户:" user
id -u $user &> /dev/null
true=$(echo $?)
while [ $true = 0  ]
do
    echo "此用户存在"
break
done
while [ $true != 0 ]
do
    echo "此用户不存在,将重新添加该用户,并且修改密码"
    useradd $user
read -p "请重新输入密码:" password
    echo $password | passwd --stdin $user
    echo "密码修改成功"
break
done


在这里插入图片描述

在这里插入图片描述

代码:

######################法二,指定要创建的用户所在文件夹,这个更加实用
#!/bin/bash
USER=`cat ~/shell02/1.txt`
for i in $USER
do
useradd $i
echo "123" | --stdin $user &> /dev/null
done

~/shell02/1.txt文件内容
[root@localhost shell02]# cat 1.txt
aa
bb
cc
dd

在这里插入图片描述

在这里插入图片描述

由于创建太多用户没必要,所以可以用:userdel -r 不需要的用户名来删除用户的同时删除家目录

==案例四:根据IP地址检查主机状态 ==

要求:IP地址存放在ipadds.txt文件中,每行一个;使用ping命令检测各主机的连通性

代码:

################## ping.sh
#!/bin/bash
ip=`cat ~/shell02/ipadds.txt`
for i in $ip
do
ping -c 3 -i 0.5 -w 2 $i &> /dev/null
if [ $? -eq 0 ];then
    echo "$i主机在线"
else
    echo "$i主机不在线"
fi
done

########################ipadds.txt内容
20.0.0.10
20.0.0.20
20.0.0.30
#################### sh ping.sh结果
20.0.0.10主机在线
20.0.0.20主机在线
20.0.0.30主机不在线

在这里插入图片描述

5.2、while循环(含案例)

重复测试某个条件,只要条件成立则反复执行

语法结构:

while 表达式
do
cmd
...
done

案例一:批量添加用户

要求:用户名称以stu开头,按数字顺序进行编号

​ 一共添加20个用户,即stu1、 stu2、…、stu20

​ 初始密码均设为123456

#!/bin/bash
a=1
while [ $a -le 20 ]
do
    useradd stu$a
echo "123456" | passwd --stdin stu$a &> /dev/null
let a++
done

在这里插入图片描述

在这里插入图片描述

==案例二:猜商品价格游戏 ==

要求:通过变量RANDOM获得随机数

​ 提示用户猜测并记录次数,猜中后退出循环.

代码:

#!/bin/bash
sorce=$[ $RANDOM %1000 ]
echo "$sorce"
a=1
num=0
while [ $a -lt 2 ]
do
    read -p "请输入您猜的价格:" price
    if [ $price -eq $sorce ];then
        echo "恭喜您,猜中了!!!"
    let num++
    let a++
    elif [ $price -gt $sorce ];then
        echo "猜高了"
    let num++
    elif [ $price -lt $sorce ];then
        echo "猜低了"
    let num++
    fi
done
echo "总共猜测了$num次"

在这里插入图片描述

注意:随机数 RANDOM的取值范围是:0-65535,一般用取余来缩小范围

5.3、until循环(含案例)

==条件:重复测试某个条件,只要条件不成立则反复执行 ==

格式:

until 表达式 
do
cmd
...
done

样式:

i=1
while [ $i -le 5 ]
do
	echo $i
	let i++
done

i=1
until [ $i -gt 5 ]
do
	echo $i
	let i++
done

案例一:使用until语句批量创建10个用户

​ 要求:stu1—stu5用户的UID分别为1001—1005;

​ stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10

代码:

#!/bin/bash
i=1
until [ $i -gt 10 ]
do
	if [ $i -le 5 ];then
		useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
	else
		[ ! -d /rhome ] && mkdir /rhome
		useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i		
	fi
let i++
done

六、date命令的运用

格式:

[root@localhost home]# date +%F
2021-07-18
[root@localhost home]# date +%Y%m%d
20210718
[root@localhost home]# date +%Y/%m/%d
2021/07/18
[root@localhost home]# date +%D
07/18/21
[root@localhost home]# date --help ###########查看date用法

操作:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

课后小试题

例题1:

计算1到100的奇数之和

思路:
1、定义一个变量来保存奇数和,sum=0
2、找出1-100的奇数,存到另一个变量 i
3、从1-100中找出奇数后,再相加,然后将和赋值给sum变量
4、遍历完毕后将sum的值打印出来
vim jsh.sh
##########################方式一
#!/bin/bash
#定义一个变量来保存奇数和
sum=0
#打印1-100的奇数并且相加重新的复制给sum变量
for i in {1..100..2} 
do 
   sum=$[ $i + $sum ]
   或者 let sum=sum+$i
done
    echo "1-100d的奇数和是:$sum"
    
##########################方式二:类C风格
    #!/bin/bash
#定义一个变量来保存奇数和
sum=0
#打印1-100的奇数并且相加重新的复制给sum变量
#i+=2相当于i=i+2
for ((i=1;i<=100;i+=2))
do 
   sum=$[ $i + $sum ]
   或者 let sum=$sum+$i
   或者 let sum=sum+$i
done
    echo "1-100d的奇数和是:$sum"

找出所有奇数(测试)

在这里插入图片描述

计算1到100的奇数之和

方法一:不带列表循环

在这里插入图片描述

方法二:类C风格(())

在这里插入图片描述

方法三:let运用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

bash -x  jsh.sh #查看计算过程

在这里插入图片描述

以上是关于宝贝,我半夜在输液,输的是想你的夜(循环语句for,while,until附带date,含案例),的主要内容,如果未能解决你的问题,请参考以下文章

模板方法 (宝,我输液了,输的想你的夜)

模板方法 (宝,我输液了,输的想你的夜)

宝, 来学习一下CSS中的宽高比,让 h5 开发更想你的夜!

蝉妈妈发布孙一宁抖音直播数据:“想你的夜”涨粉200万

for循环中,为啥不执行循环?

switch case语句总执行第一个case