shell脚本for循环和while、until

470 阅读3分钟

for

执行机制:遍历

执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环
结束
如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"

for循环原理.png

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

输出1-10 .1.png

[root@localhost ~]# for i in $(seq 1 10)
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10

输出1-10 .2.png

[root@localhost ~]# for ((i=1; i<=10; i++))
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10

输出1-10 .3.png

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
 
 

基数.png

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

偶数.png

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"

1-10求和.png

求和结果.png

上点难度 根据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

ping主机IP.png

畅通.png

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:所有的身份验证令牌已经成功更新。

批量添加用户.png

批量添加用户结果.png

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

8为随机密码.png

8为密码结果.png

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

分隔符.png

风额度.png

while

while循环语句的用法

  • 重复测试某个条件,只要条件成立则反复执行。
  • 使用场景:相对于for需要知道循环次数,当我们只知道停止条件,不知道次数时,就需要使用while。

格式

while 条件测试操作  
do   
  命令序列  
done


while原理图.png

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

打印0-10.png

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

1-10的和.png

1-10求和结果.png

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

批量添加用户while.png

while结果.png

until循环

用法

  • 重复测试某个条件,只要条件不成立则反复执行

格式

until 条件测试操作 
do     
    命令序列  
done

until循环示例图.png

演示

打印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



until求和.png

until求和结果.png