前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell脚本快速入门之-----循环(for、while、until)

shell脚本快速入门之-----循环(for、while、until)

作者头像
不吃小白菜
发布2020-09-03 10:14:00
1.1K0
发布2020-09-03 10:14:00
举报
文章被收录于专栏:用户7721898的专栏

一、for循环

1、for循环语句

for语句结构

代码语言:javascript
复制
语句结构
for 变量名 in 取值列表
do
	命令序列
done
代码语言:javascript
复制
语句结构举例
for 收件人 in 邮件地址列表
do
	发送邮件
done
在这里插入图片描述
在这里插入图片描述

2、使用for批量添加用户

用户名存放在users.txt文件中,每行一个

代码语言:javascript
复制
初始密码均设为123456
[root@localhost opt]# vim user.txt
zhangsan
lisi
wangermazi
zhaoliu
tianji
wangba
[root@localhost opt]# vim useradd.sh
#!/bin/bash
Lists=$(cat /opt/user.txt)
for bb in $Lists
do
        useradd $bb
        echo "123456" | passwd --stdin $bb
        echo "$bb添加成功"
done
[root@localhost opt]# chmod +x useradd.sh 
[root@localhost opt]# ./useradd.sh 
Changing password for user zhangsan.
passwd: all authentication tokens updated successfully.
zhangsan添加成功
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
Changing password for user lisi.
passwd: all authentication tokens updated successfully.
lisi添加成功
Changing password for user wangermazi.
passwd: all authentication tokens updated successfully.
wangermazi添加成功
Changing password for user zhaoliu.
passwd: all authentication tokens updated successfully.
zhaoliu添加成功
Changing password for user tianji.
passwd: all authentication tokens updated successfully.
tianji添加成功
Changing password for user wangba.
passwd: all authentication tokens updated successfully.
wangba添加成功
[root@localhost opt]# cat /etc/passwd | grep "bash"
root:x:0:0:root:/root:/bin/bash
dd:x:1000:1000:cn-tangzheng:/home/dd:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
wangermazi:x:1003:1003::/home/wangermazi:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
tianji:x:1005:1005::/home/tianji:/bin/bash
wangba:x:1006:1006::/home/wangba:/bin/bash
代码语言:javascript
复制
脚本可以适当修改优化:如
 echo "123456" | passwd --stdin $bb &> /dev/null
代码语言:javascript
复制
批量删除用户:在刚刚的基础上修改
[root@localhost opt]# vim useradd.sh
#!/bin/bash
Lists=$(cat /opt/user.txt)
for bb in $Lists
do
        userdel -r $bb	'-r 删除家目录'
        #echo "123456" | passwd --stdin $bb &> /dev/null
        echo "$bb删除成功"
done

[root@localhost opt]# ./useradd.sh 
zhangsan删除成功
lisi删除成功
wangermazi删除成功
zhaoliu删除成功
tianji删除成功
wangba删除成功
[root@localhost opt]# cat /etc/passwd | grep "bash"
root:x:0:0:root:/root:/bin/bash
dd:x:1000:1000:cn-tangzheng:/home/cn-tangzheng:/bin/bash

3、示例–根据IP地址检查主机状态

检测IP地址192.168.197.0-192.168.197.10段落

使用ping命令检测各主机的连通性

代码语言:javascript
复制
[root@localhost opt]# vim ipchk.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
  ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
  if [ $? -eq 0 ]
        then
        echo "Host 192.168.197.$i is up"
  else
        echo "Host 192.168.197.$i is down"
  fi
done
[root@localhost opt]# ./ipchk.sh 
Host 192.168.197.1 is up
Host 192.168.197.2 is up
Host 192.168.197.3 is down
Host 192.168.197.4 is down
Host 192.168.197.5 is down
Host 192.168.197.6 is down
Host 192.168.197.7 is down
Host 192.168.197.8 is down
Host 192.168.197.9 is down
Host 192.168.197.10 is down

4、用循环语句输出1-10的数字的四种办法

方式一:

代码语言:javascript
复制
#!/bin/bash
for ((i=1;i<=10;i++))
do
        echo "$i"
done

方式二:

代码语言:javascript
复制
#!/bin/bash
i=1
for ((;i<=10;i++))
do
        echo "$i"
done

方式三:

代码语言:javascript
复制
#!/bin/bash
i=1
for ((;i<=10;))
do
        echo "$i"
        let i++
done

方式四:

代码语言:javascript
复制
#!/bin/bash
i=1
for ((;;))
do
  if [ $i -le 10 ]
        then
        echo "$i"
        let i++
  else
        exit 0
  fi
done

输出结果

代码语言:javascript
复制
[root@localhost opt]# ./number.sh 
1
2
3
4
5
6
7
8
9
10

5、shell中let命令

  • let 对整数进行数学运算
  • let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
代码语言:javascript
复制
语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))
  • 当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号’ '将表达式包围起来。
  • 和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

6、计算1-10偶数/奇数的和

方式一:计算偶数的和

代码语言:javascript
复制
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
  do
        let sum+=$i
  done
        echo "总和为:$sum"

方式一:计算奇数的和

代码语言:javascript
复制
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
  do
        let sum+=$i
  done
        echo "总和为:$sum"

方式二:求偶数和

代码语言:javascript
复制
#!/bin/bash
sum=0
for((i=0;i<=10;i+=2))
  do
        if [ `expr $i % 2` -eq 0 ]
         then
           let sum+=$i
        fi
  done
        echo "总和为:$sum"

方式二:求奇数和

代码语言:javascript
复制
#!/bin/bash
sum=0
for((i=1;i<=10;i+=2))
  do
        if [ `expr $i % 2` -eq 1 ]
         then
           let sum+=$i
        fi
  done
        echo "总和为:$sum"

二、while循环语句

1、while语句结构

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

代码语言:javascript
复制
语句结构
while 条件测试操作
do
	命令序列
done
代码语言:javascript
复制
语句结构示例
while 未猜中正确的价格
do
	反复猜测商品价格
done
在这里插入图片描述
在这里插入图片描述

2、while语句应用示例

使用while循环语句输出1-10数字

代码语言:javascript
复制
#!/bin/bash
i=0
while [ $i -le 10 ]
do
  echo "$i"
  let i++
  [root@localhost opt]# . cccc.sh 
0
1
2
3
4
5
6
7
8
9
10

3、while死循环

代码语言:javascript
复制
while true:死循环有时候也有奇效,可与用户交互

#!/bin/bash
while true
do
  read -p "请输入yes退出:" KEY
  if [ $KEY = yes ]
        then
          break
  fi
done
echo "正常退出"

1
2
3
4
5
6
7
8
9
10
11
[root@localhost opt]# ./sixunhuan.sh 
请输入yes退出:no
请输入yes退出:1
请输入yes退出:d
请输入yes退出:!
请输入yes退出:a
请输入yes退出:yes
正常退出

4、使用while批量添加用户

用户名称以stu开头,按数字顺序进行编号

一共添加20个用户,即stu1,stu2…stu20

初始密码设置为

代码语言:javascript
复制
#!/bin/bash
i=0
while [ $i -le 19 ]
do
  let i++
  useradd stu$i
  echo "123456" | passwd --stdin stu$i &> /dev/null
  echo "stu$i添加成功"
done
echo "添加完毕"
代码语言:javascript
复制
[root@localhost opt]# ./useradd.sh 
stu1添加成功
stu2添加成功
stu3添加成功
stu4添加成功
stu5添加成功
stu6添加成功
stu7添加成功
stu8添加成功
stu9添加成功
stu10添加成功
stu11添加成功
stu12添加成功
stu13添加成功
stu14添加成功
stu15添加成功
stu16添加成功
stu17添加成功
stu18添加成功
stu19添加成功
stu20添加成功
添加完毕

5、猜商品价格游戏

通过变量RANDOM获得随机数

提示用户猜测并记录次数,猜中后退出循环

代码语言:javascript
复制
#!/bin/bash
A=`expr $RANDOM % 1000`
i=0
echo "商品的实际价格为0-999之间,猜猜看是多少?"
read -p "请输入你猜测的价格数目:" num
while [ $num -le 999 ] && [ $num -ge 1 ] 
do
        let i++
     if [ $num -eq $A ]
        then
        echo "恭喜你答对了,实际价格是$A"
        echo "你一共猜测了$i 次"
        exit 0
     elif [ $num -lt $A ]
        then
        echo "太低了"
        read -p "请输入你猜测的价格数目:" num
     else
        echo "太高了"
        read -p "请输入你猜测的价格数目:" num
     fi
  done

三、untli循环语句

1、until语句的结构

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

代码语言:javascript
复制
until 条件测试操作
do
 命令序列
done
代码语言:javascript
复制
while 未超过10
do
 数字依次增加
done
在这里插入图片描述
在这里插入图片描述

2、until语句应用1

计算1–50的和

通过循环累加的方式计算1–50的和

代码语言:javascript
复制
#!/bin/bash
i=1
S=0
until [ $i -eq 51 ]
do
 let S+=$i
 let i++

done
echo "$S"
代码语言:javascript
复制
[root@localhost opt]# ./jisuan.sh 
1275

3、until语句应用2

为指定用户发送在线消息

若指定用户不在线(未登陆系统),则每10分钟(实验中为了测试效果,可改为3s)试一次,直至用户登录系统后再发送信息 用户名与消息通过为止参数传递给脚本

代码语言:javascript
复制
#!/bin/bash
username=$1
#判断格式参数是否为空
if [ $# -lt 1 ]
 then
 echo "Usage:`basename $0` <username> [<message>]"
 exit 1
fi
#判断账号是否存在
if grep "^$username:" /etc/passwd &> /dev/nell;then :
  else
        echo "用户不存在"
        exit 2
fi
#判断用户是否在线
until who | grep "$username" &> /dev/null
do
        echo "用户不在线,正在尝试连接"
        sleep 3
done
mes=$*
echo "$mes" | write "$username"
代码语言:javascript
复制
[root@localhost opt]# ./mes.sh 
Usage:mes.sh <username> [<message>]
[root@localhost opt]# ./mes.sh wangwu
用户不存在
[root@localhost opt]# ./mes.sh stu1
用户不在线,正在尝试连接
用户不在线,正在尝试连接
^C
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、for循环
  • 1、for循环语句
  • 2、使用for批量添加用户
  • 3、示例–根据IP地址检查主机状态
  • 4、用循环语句输出1-10的数字的四种办法
  • 5、shell中let命令
  • 6、计算1-10偶数/奇数的和
  • 二、while循环语句
    • 1、while语句结构
      • 2、while语句应用示例
        • 3、while死循环
          • 4、使用while批量添加用户
            • 5、猜商品价格游戏
            • 三、untli循环语句
              • 1、until语句的结构
                • 2、until语句应用1
                  • 3、until语句应用2
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档