for
执行机制:遍历
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环
结束
如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"
for循环格式
for (( 表达式1; 表达式2; 表达式3 ));
do 命令;
done
for循环演示
1.打印1-10的方法
[root@localhost ~]# for i in {1..10}
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# for i in $(seq 1 10)
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# for ((i=1; i<=10; i++))
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
2.打印1-10的基数
[root@localhost ~]# for i in {1..10..2} //分号可以在一行中执行多条命令
do
echo $i
done
1
3
5
7
9
[root@localhost ~]#for i in $(seq 1 2 10)
do
echo $i
done
1
3
5
7
9
[root@localhost ~]#for ((i=1;i<=10;i+=2))
do
echo $i
done
1
3
5
7
9
3.打印1-10的偶数
[root@localhost ~]# for i in {2..10..2}; do echo $i; done
2
4
6
8
10
[root@localhost ~]# for i in $(seq 2 2 10);do echo $i;done
2
4
6
8
10
[root@localhost ~]# for ((i=2;i<=10;i+=2));do echo $i;done
2
4
6
8
10
for循环应用示例
1.计算1-10的和
[root@localhost ~]# vim 10.sh ##新建一个shell脚本
#!/bin/bash
#求从1加到10的和。
sum=0
for i in {1..10}
do
sum=$[sum+i]
done
echo "求和的结果是$sum"
上点难度 根据IP地址查看本机状态
[root@localhost ~]# vim ip.txt
[root@localhost ~]# cat ip.txt
192.168.132.3
192.168.132.5
192.168.132.6
[root@localhost ~]# vim 11.sh
1 #!/bin/bash
2
3 ip=$(cat /root/ip.txt)
4 for i in $ip
5 do
6 ping -c 3 $i &>/dev/null
7 if
8 [ $? -eq 0 ]
9 then
10 echo "地址$i网络畅通"
11 else
12 echo "地址$i网络不畅通"
13 fi
14 done
2.for循环批量添加用户
[root@localhost djq]# cat user.txt ##新建一个文件,存放要创建用户的名字
wry
djq2
djq3
laoliu
laoqi
[root@localhost djq]# vim 10.sh ##创建shell脚本
#!/bin/bash
for user in $(cat /opt/djq/user.txt) ##用户名在这个文件里,注意,一定要用绝对路径
do
useradd $user ##创建用户
echo "root123" | passwd --stdin $user ##创建用户的密码为root123
done ##结束
[root@localhost djq]# ./10.sh ##执行shell脚本
更改用户 wry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 djq2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 djq3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 laoliu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 laoqi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
3.随机生成8位密码
[root@localhost djq]# vim 11.sh
#!/bin/bash
#定义密码取值范围
string="abcdefghijklmnopqrstuvwxyz1234567890"
#循环8次
for i in {1..8}
do
#每次循环随机获取0到字符串长度减1的下标值
num=$[RANDOM % ${#string}]
#进行字符串截取,每次随机取出一个字符
var=${string:$num:1}
#每次追加生成的密码,passwd+=$var等同于passwd=$passwd$var
passwd+=$var
done
echo "本次生成的密码为: $passwd"
[root@localhost djq]# chmod +x *
[root@localhost djq]# ./11.sh
本次生成的密码为: ww9gbyu6
[root@localhost djq]# ./11.sh
本次生成的密码为: iknfokvm
[root@localhost djq]# ./11.sh
本次生成的密码为: 7hpa1h3t
for的分隔符
环境变量$IFS, 是指内部字段分隔符,默认的for分隔符有三个:1:空格 2:制表符\t 3:换行符\n
[root@localhost djq]# vim name.txt
[root@localhost djq]# cat name.txt
deng jia qi
liu shan yu
lu jia hao
huang wen di
[root@localhost djq]# vim 12.sh
#!/bin/bash
#借用一个临时变量先保存IFS的原始值
IFS_OLD=$IFS
#删除空格和制表符,只保留换行符作为分隔符
IFS=$'\n'
#从文件中获取变量值,$()表示调用命令执行的结果
for name in $(cat name.txt)
do
echo "$name"
done
IFS=$IFS_OLD
[root@localhost djq]# chmod +x *
[root@localhost djq]# ./12.sh
deng jia qi
liu shan yu
lu jia hao
huang wen di
while
while循环语句的用法:
- 重复测试某个条件,只要条件成立则反复执行。
- 使用场景:相对于for需要知道循环次数,当我们只知道停止条件,不知道次数时,就需要使用while。
格式
while 条件测试操作
do
命令序列
done
while语句演示
1.打印0-10
[root@localhost djq]# a=0
[root@localhost djq]# while [ $a -le 10 ] ##只要满足a≤10,就输出a的值,
> do
> echo $a ##满足a小于等于10
> let a++ ##那么输出a的值且加1
> done
0
1
2
3
4
5
6
7
8
9
10
2.求1-10所有整数的和
[root@localhost djq]# vim 14.sh
#!/bin/bash
sum=0
i=1
while [ $i -le 10 ]
do
sum=$[sum+i]
let i++
done
echo "1-10之间所有整数和为:$sum"
[root@localhost djq]# chmod +x *
[root@localhost djq]# ./14.sh
1-10之间所有整数和为:55
2.while循环示例
1.批量添加用户
[root@localhost djq]# vim 13.sh
1 #!/bin/bash
2
3 a=1
4 while [ $a -le 10 ]
5 do
6 useradd $a -M
7 echo "123123"|passwd --stdin $a &>/dev/null
8 let a++
9 done
[root@localhost djq]# bash 13.sh
[root@localhost djq]# tail -10 /etc/passwd
1:x:1006:1006::/home/1:/bin/bash
2:x:1007:1007::/home/2:/bin/bash
3:x:1008:1008::/home/3:/bin/bash
4:x:1009:1009::/home/4:/bin/bash
5:x:1010:1010::/home/5:/bin/bash
6:x:1011:1011::/home/6:/bin/bash
7:x:1012:1012::/home/7:/bin/bash
8:x:1013:1013::/home/8:/bin/bash
9:x:1014:1014::/home/9:/bin/bash
10:x:1015:1015::/home/10:/bin/bash
until循环
用法
- 重复测试某个条件,只要条件不成立则反复执行
格式
until 条件测试操作
do
命令序列
done
演示
打印1-10
[root@localhost djq]# until [ $a -ge 10 ]; do echo $a; let a++; done
1
2
3
4
5
6
7
8
9
10
2.求1-10的整数和
[root@localhost djq]# vim 15.sh
#!/bin/bash
sum=0
i=1
until [ $i -gt 10 ]
do
sum=$[sum+i]
let i++
done
echo "1-10的整数和为 $sum"
[root@localhost djq]# chmod +x *
[root@localhost djq]# ./15.sh
1-10的整数和为 55