目录
for循环
while 循环
前面说完了if判断语句,现在该来学习shell脚本中的另一个重点内容了,那就是循环语句。循环语句分为 for 循环和 while 循环,二者本质上来说是没有太大区别,但针对不同的情况,使用不同的语句可以事半功倍,我们先从for循环开始逐步学习。
for循环
for循环有几种语法结构,分别是列表循环,不带列表循环,类C风格的循环
循环列表
用法就是 for 变量名 in {1..10} 或者 for 变量名 seq i in $(seq 10)
do
执行语句
done
假如我要输出1~50 之间的数字,就不需要一个一个echo了
不带循环列表
for i
do
echo $i 或者 echo hello
done
类C风格循环
就和C语言中的for循环一致,先定义i的值,然后每执行一次操作,i+1,当i<=10的时候,停止
for ((i=0;i<=10;i++))
do
执行的操作
done
循环语句差不多就是这样,没有什么需要特别记忆的原理之类的,主要就是记住规则后,巧妙地应用,然后多加练习
例1 打印50以内的奇数
还是老样子,我们先分析逻辑,50以内的奇数就是1,3,5,7,9......公差为2,如果从0-50全部打印那就是直接i++就可以了,那么同理,奇数就是从1开始,+2
这样就可以了,是不是很简单
运行结果
同理我们也可以输出比如,3的倍数,4的倍数等等
例2 批量添加10个用户并设置密码(用户名1...用户名10)
逻辑是,用户名后面的1..10是可以通过for循环连续输出的,所以我们只要创建用户时引用这个值就可以了,然后在脚本执行的时候输入 uname ,创建用户时再在$i前面引用uname,然后再将默认密码传递给passwd命令,就可以了
运行结果
创建了这么多用户,总不能一个一个删吧,想要批量删除,直接把useradd 改成userdel ,后面的passwd修改密码内容全部删掉就ok了
例2同样的扩展,现实情况中,一个公司如果新入职一批员工,要为他们新建用户,假如用户名就是他们的名字,总不可能每个人都叫同一个名字吧?这种情况该如何处理?
其实要改动的并不是很多,我们拿到名单后,将名字单独导入到一个txt文件,比如像这样
中间那一长串的意思就是,查看刚才导入的name.txt 文件,然后过滤第i行,第二列,就可以成功的依次导入新员工的姓名缩写了
看看执行结果(jay已经创建过了,所以这里只有八个人)
while 循环
while 循环不像for循环有不同的输入方式,它只有一种打开方式,那就是
while 表达式
do
执行的操作
done
首先先来一个简单的例题吧
例1 输出100以内,不能被7整除的数
思路和之前那个输出奇数差不多,只不过这次不是加了,是判断自增数是否能整除(%)7,i在100以内自增,每次自增都要判断一下是否能整除7,可以的话直接输出
看一下运行结果
大家可以找点例题或者需求来敲一敲,多加练习才是王道