|NO.Z.00024|——————————|LinuxShell|——|Linux&Shell&流程控制.V05|——|for循环|
一、for循环
### --- 语法一
for 变量 in 值 1 值 2 值 3…
do
程序
done
### --- for循环语法一:
~~~ for 循环是固定循环,也就是在循环时已经知道需要进行几次的循环,
~~~ 有时也把 for 循环称为计数循环。for 的语法有如下两种:
~~~ # 注:
~~~ 这种语法中 for 循环的次数,取决于 in 后面值的个数(空格分隔),
~~~ 有几个值就循环几次,并且每次循环都把值赋予变量。
~~~ 也就是说,假设 in 后面有三个值,for 会循环三次,
~~~ 第一次循环会把值1 赋予变量,第二次循环会把值 2 赋予变量,以此类推。
### --- 语法二
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
### --- 语法二中需要注意:
~~~ # 初始值:
~~~ 在循环开始时,需要给某个变量赋予初始值,如 i=1;
~~~ # 循环控制条件:
~~~ 用于指定变量循环的次数,如 i<=100,则只要 i 的值小于等于 100,循环就会继续;
~~~ # 变量变化:
~~~ 每次循环之后,变量该如何变化,如 i=i+1。代表每次循环之后,变量 i 的值都加 1。
二、语法一:for循环实例
### --- 打印时间
[root@localhost ~]# vi sh/for.sh
#!/bin/bash
#打印时间
# Author: shenchao (E-mail: shenchao@atguigu.com)
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
### --- 批量解压脚本就应该这样写
root@localhost ~]# vi sh/auto-tar.sh
#!/bin/bash
#批量解压缩脚本
# Author: shenchao (E-mail: shenchao@atguigu.com)
cd /lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz 结尾的文件的文件覆盖到 ls.log 临时文件中
for i in $(cat ls.log)
#读取 ls.log 文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量 i
do
tar -zxf $i &>/dev/null
#加压缩,并把所有输出都丢弃
done
rm -rf /lamp/ls.log
#删除临时文件 ls.log
三、语法二:实验举例
### --- 实例一:
~~~ 那语法二就和其他语言中的 for 循环更加类似了,也就是事先决定循环次数的固定循环了。
~~~ 先举个简单的例子:
#从1加到100
#!/bin/bash
#从 1 加到 100
# Author: shenchao (E-mail: shenchao@atguigu.com)
s=0
for (( i=1;i<=100;i=i+1 ))
#定义循环 100 次
do
s=$(( $s+$i ))
每次循环给变量 s 赋值
done
echo "The sum of 1+2+...+100 is : $s"
#输出 1 加到 100 的和
### --- 实例二:批量添加指定数量的用户
[root@localhost ~]# vi useradd.sh
#!/bin/bash
#批量添加指定数量的用户
# Author: shenchao (E-mail: shenchao@atguigu.com)
read -p "Please input user name: " -t 30 name
#让用户输入用户名,把输入保存入变量 name
read -p "Please input the number of users: " -t 30 num
#让用户输入添加用户的数量,把输入保存入变量 num
read -p "Please input the password of users: " -t 30 pass
#让用户输入初始密码,把输入保存如变量 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
#判断三个变量不为空
then
y=$(echo $num | sed 's/[0-9]//g')
#定义变量的值为后续命令的结果
#后续命令作用是,把变量 num 的值替换为空。如果能替换为空,证明 num 的值为数字
#如果不能替换为空,证明 num 的值为非数字。我们使用这种方法判断变量 num 的值为数字
if [ -z "$y" ]
#如果变量 y 的值为空,证明 num 变量是数字
then
for (( i=1;i<=$num;i=i+1 ))
#循环 num 变量指定的次数
do
/usr/sbin/useradd $name$i &>/dev/null
#添加用户,用户名为变量 name 的值加变量 i 的数字
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
#给用户设定初始密码为变量 pass 的值
done
fi
fi
### --- 实例三:批量删除用户
[root@localhost ~]# vi sh/userdel.sh
#!/bin/bash
#批量删除用户
# Author: shenchao (E-mail: shenchao@atguigu.com)
user=$(cat /etc/passwd | grep "/bin/bash"|grep -v "root"|cut -d ":" -f 1)
#读取用户信息文件,提取可以登录用户,取消 root 用户,截取第一列用户名
for i in $user
#循环,有多少个普通用户,循环多少次
do
userdel -r $i
#每次循环,删除指定普通用户
done
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
cdv008-shell
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通