for循环语句
用法:
- 读取不同的变量值,用来逐个执行同一组命令。
- 使用场景:一般用于循环次数事先已知的场景。
- 执行机制:遍历。
格式:
for 变量名 in 取值列表
do
命令序列
done
复制代码
执行机制:
1.依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
2.如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"
复制代码
演示
1、打印1到10
[root@localhost ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@localhost ~]# seq 1 10
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# for i in {1..10};do echo $i; done
1
2
3
4
5
6
7
8
9
10
2、打印1到10之间的奇数
[root@localhost ~]# echo {1..10..2}
1 3 5 7 9
[root@localhost ~]# seq 1 2 10
1
3
5
7
9
[root@localhost ~]# for i in {1..10..2};do echo $i; done
1
3
5
7
9
3、打印1到10之间的偶数
[root@localhost ~]# echo {2..10..2}
2 4 6 8 10
[root@localhost ~]# seq 2 2 10
2
4
6
8
10
[root@localhost ~]# for i in {2..10..2};do echo $i; done
2
4
6
8
10
实例
1、求从1加到100的和。
[root@localhost ~]# vim sum100.sh
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[sum+i]
done
echo "和为 $sum"
[root@localhost ~]# bash sum100.sh
和为 5050
2、生成6位随机密码
[root@localhost ~]# vim 223.sh
#!/bin/bash
STR="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890"
sum=' '
for ((i=1;i<=6;i++))
do
length=${#STR}
num=$[RANDOM % length] //每次循环随机获取0到字符串长度减1的下标值
value=${STR:num:1} //进行字符串截取,每次随机取出1个字符
sum+=$value //每次追加生成的密码,sum+=$value等同于sum=$sum$value
done
echo $sum
[root@localhost ~]# bash 223.sh
zpGgX2
[root@localhost ~]# bash 223.sh
iiPFux
多线程执行脚本(并行执行)
普通for循环是串行,一个一个执行。
在do和done中间增加 { } 符号,可以多线程同时执行。
[root@localhost ~]# vim 118.sh
#!/bin/bash
#多线程,同时ping多台主机
for i in {10..20}
do
{
ping -c 2 -w 2 -i 0.5 192.168.1.$i &>/dev/null
if [ $? -eq 0 ]
then
echo "192.168.1.$i " >> ~/host_ip
else
echo "192.168.1.$i is dead" $>/dev/null
fi
}&
#{ }表示多线程同时执行 #增加 & 符号,表示将进程放到后台运行,后台命令之间是不区分 先来后到关系的
done
wait
#wait的作用是等待上面所有后台进程都执行完毕后,才会去执行后 面的语句。如果没有wait,后面的语句是不会等待后台进程的,会>造成一些需要有上下文关系的程序执行错误。
cat /root/host_ip
[root@localhost ~]# bash 118.sh
192.168.1.10
for的三个默认分隔符
环境变量$IFS,是指内部字段分隔符, 默认为三个:空格、制表符 \t、换行符 \n。
使用set命令查看所有变量:
分隔符的作用演示:
示例:使用for读取文件内容,文件中有空格
[root@localhost ~]# vim 224.sh
#!/bin/bash
for name in $(cat 1.txt)
do
echo "$name"
done
[root@localhost ~]# cat 1.txt
12312 23 33 44 55 66
[root@localhost ~]# bash 224.sh
12312
23
33
44
55
66
while循环语句
用法:
- 重复测试某个条件,只要条件成立则反复执行。
- 使用场景:相对于for需要知道循环次数,当我们只知道停止条件,不知道次数时,就需要使用while。
格式:
while 条件测试操作
do
命令序列
done
演示
1、打印0到10
[root@localhost ~]# a=0
[root@localhost ~]# while [ $a -le 10 ] //只要满足a≤10,就输出a的值,之后让a自增1
> do
> echo $a
> let a++
> done
0
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# echo $a ////最后一次输出a的值后,a又加了1,所以现在a的值是11
11
实例
1、批量添加用户
[root@localhost ~]# vim while.sh
#!/bin/bash
a=1
while [ $a -le 10 ]
do
useradd $a -M
echo "123123"|passwd --stdin $a &>/dev/null
let a++
done
[root@localhost ~]# bash while.sh
[root@localhost ~]# tail -10 /etc/passwd
1:x:1009:1009::/home/1:/bin/bash
2:x:1010:1010::/home/2:/bin/bash
3:x:1011:1011::/home/3:/bin/bash
4:x:1012:1012::/home/4:/bin/bash
5:x:1013:1013::/home/5:/bin/bash
6:x:1014:1014::/home/6:/bin/bash
7:x:1015:1015::/home/7:/bin/bash
8:x:1016:1016::/home/8:/bin/bash
9:x:1017:1017::/home/9:/bin/bash
10:x:1018:1018::/home/10:/bin/bash
until循环语句
用法:
- 重复测试某个条件,只要条件不成立则反复执行。
格式:
until 条件测试操作
do
命令序列
done
演示
打印1到10:
[root@localhost ~]# until [ $a -gt 10 ]
> do
> echo $a
> let a++
> done
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# echo $a
11
实例
计算1到10的和
[root@localhost ~]# vim 226.sh
#!/bin/bash
sum=0
i=1
until [ $i -gt 10 ]
do
sum=$[sum+i]
let i++
done
echo "结果为 $sum"
[root@localhost ~]# bash 226.sh
结果为 55
总结
while 与 until 极为相似,但范围确实相反,循环也可嵌套使用