宝贝,我半夜在输液,输的是想你的夜(循环语句for,while,until附带date,含案例),
Posted 老张学coding
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,含案例),的主要内容,如果未能解决你的问题,请参考以下文章