云计算运维一定要掌握的方便省事的Shell循环结构(while、for、until详细实例)

   日期:2020-09-30     浏览:105    评论:0    
核心提示:循环语句,主要是为了简化重复动作代码,在运维方面主要用于重复某项动作,例如批量创建用户,在shell中主要有两种 while循环 与 for 循环。

目录

  • 什么是shell
  • 一:shell循环语句
      • 1.1:for循环
      • 1.2:echo用法
      • 1.3:姓名列表批量创建账户
      • shell中let命令
  • 二:while循环语句
      • 1.21:使用while循环1-10数字
      • 1.22:whlie死循环
      • 1.23:使用whlie批量添加用户
      • 1.24:10以内所有自然数的平方值 如1*1
  • 三:continue和break区别
  • 四:until循环语句
      • 1.41:计算1-20的和
      • 1.42:until语句应用

什么是shell

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至时编写一些程序。Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令

一:shell循环语句

1.1:for循环

for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。

for      #条件
do   
       #执行命令
done     #结束             

行1,讲串行中的字段迭代放入变量中
行2-4,接着将重复执行do和done之间的命令区域,直到串行中每一个字段军处理过为止。

#!/bin/bash
for ((a=10;a>0;a--))
do
  echo -n " TIME $a"
  echo -ne "\r "    #不换行覆盖输出
  sleep 1
done

1.2:echo用法

echo [-ne][字符串]或 echo [--help][--version]
  补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。
  参   数:  -n 不要在最后自动换行
          -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般
          文字输出:
          \a 发出警告声;
          \b 删除前一个字符;
          \c 最后不加上换行符号;
          \f 换行但光标仍旧停留在原来的位置;
          \n 换行且光标移至行首;
          \r 光标移至行首,但不换行;
          \t 插入tab;
          \v 与\f相同;
          \\ 插入\字符;
          \nnn 插入nnn(八进制)所代表的ASCII字符;
        --help 显示帮助
        --version 显示版本信息 
  范例 :   [root@localhost ~]# echo "what is your name "

1.3:姓名列表批量创建账户

[root@server1 ~]# vi 1.txt 
tom
jerry
wendy
[root@server1 ~]# vim 1.sh
#!/bin/bash
a=$(cat /root/1.txt)
for b in $a
do
 useradd $b
 echo "654321" | passwd --stdin $b
 echo "创建{$b}完成"
done
[root@server1 ~]# sh 1.sh
更改用户 tom 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建{ tom}完成
更改用户 jerry 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建{ jerry}完成
更改用户 wendy 的密码 。
passwd:所有的身份验证令牌已经成功更新。
创建{ wendy}完成

语法2:

for ((初始化;;循环控制条件;变量变化)do
程序
done

需要注意以下几点:

  • 初始值:在循环开始时,需要给某个变量赋予初始值,如 i=1。

  • 循环控制条件:用于指定变量循环的次数,i<=100,则只要 i 的值小于等于 100,循环就会继续。

  • 变量变化:每次循环之后,变量该如何变化,如 i=i+1,代表每次循环之后,变量的值都加 1。

  • 语法二和其他语言中的 for 循环类似,也就是事先决定循环次数的固定循环。先举一个简单的例子。
    +、-、*、/

  • (++) 自身变量+1

  • (- -)自身变量-1

  • (+=5) 自身变量

  • (-=)5 自身变量-5

  • ( * )5自身变量*5

lt 可以单独使用 % 自身变量 %5
+=5 自身变量 +5自身变量 %5
-=5 自身变量-5 * 5自身变量*5
/= 自身变量/5

##continue和break区别)# 1.14:100以内不能整除3的数

[root@server1 ~]# vim c.sh
#!/bin/bash
i=100
while [ $i -gt 0 ]
do
  if [ `expr $i % 3` -eq 0 ];then
    let i--
    continue
else
    echo -n " $i"
fi
let i--
done
[root@server1 ~]# sh c.sh 
 100 98 97 95 94 92 91 89 88 86 ……

shell中let命令

let 对整数进行数学运算
let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))
  • 当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号’ '将表达式包围起来。
  • 和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

二:while循环语句

while 循环主要用于无限次的循环情况,例如登录认证,你不知道多少次可以登录成功,当然可以认为限制登录次数。

1.21:使用while循环1-10数字

#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
let i++
done
[root@server1 ~]# sh d.sh 
0
1
2
3
4
5
6
7
8
9
10

1.22:whlie死循环

while true:死循环有时候也有奇效,可与用户交互

#!/bin/bash
while true
do
 read -p '输入tom才可退出:' a
 if [ $a = tom ]
   then
    break
fi
done
echo '退出' 
[root@server1 ~]# sh f.sh 
输入tom才可退出:a
输入tom才可退出:tom
退出
[root@server1 ~]# 

1.23:使用whlie批量添加用户

用户名称以shuai开头,按照顺序进行排序
一共添加了5个账户,即hua1…hua5

#!/bin/bash
a=0
while [ $a -le 5 ]
do
  let a++
  useradd tom$a
  echo "123123" | passwd --stdin tom$a &> /dev/null
  echo "tom$添加完毕"
done
echo "结束"
[root@server1 ~]# sh g.sh 
tom$添加完毕
tom$添加完毕
tom$添加完毕
tom$添加完毕
tom$添加完毕
tom$添加完毕
结束

1.24:10以内所有自然数的平方值 如1*1

#!/bin/bash
num=1
while [ $num -lt 10 ]
do
  a=$(expr $num \* $num)
  echo $a
  let num++
done
[root@server1 ~]# sh 2.sh 
1
4
9
16
25
36
49
64
81

猜商品价格游戏
通过变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环

#!/bin/bash
#猜商品价格
RR=$(expr $RANDOM % 1000)   #$RANDOM 生成1000以内的随机数
i=0
echo "猜价格游戏"
while true
 do
 read -p "请输入商品价格(0-999):" num
 let i++
 if [ $num -eq $RR ];then
 echo "恭喜猜中了"
 echo "恭喜猜中了$i"
 break
elif [ $num -gt $RR ];then
 echo "猜高了"
else
 echo "猜低了"
fi
done
[root@server1 ~]# sh 3.sh 
猜价格游戏
请输入商品价格(0-999):500
猜高了
请输入商品价格(0-999):255
猜低了
请输入商品价格(0-999):400
猜高了
请输入商品价格(0-999):350
猜高了
请输入商品价格(0-999):300
猜高了
请输入商品价格(0-999):275
猜低了
请输入商品价格(0-999):285
猜低了
请输入商品价格(0-999):293
猜低了
请输入商品价格(0-999):296
猜低了
请输入商品价格(0-999):299
恭喜猜中了
一共猜了了10次

三:continue和break区别

break 命令可以带一个参数,一个不带参数的break 循环只能退出最内层的循环,而break N可以退出N 层循环
continue 命令也可以带一个参数,一个不带参数的continue 命令只去掉本次循环的剩余代码,而continue N 将会把N 层循环剩余的代码都去掉,但是循环的次数不变

#!/bin/sh  
for i in a b c d
do
     echo
        echo -n "$i "
        for j in `seq 10`
        do
                if [ $j == 5 ]; then
                #       break
                #       break 2
                #       continue
           continue 2
            fi
        echo -n "$j "
        done
        echo
done
echo
break结果:
a 1 2 3 4 
b 1 2 3 4 
c 1 2 3 4 
d 1 2 3 4 
break 2的结果:
a 1 2 3 4 
continue结果:
a 1 2 3 4 6 7 8 9 10 
b 1 2 3 4 6 7 8 9 10 
c 1 2 3 4 6 7 8 9 10 
d 1 2 3 4 6 7 8 9 10
continue 2的结果:
a 1 2 3 4 
b 1 2 3 4 
c 1 2 3 4 
d 1 2 3 4 
# 四:untli循环语句
!

四:until循环语句

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

until 条件测试操作
do
 命令序列
done
while 未超过20
do
 数字依次增加
done:

行1,如果条件测试结果为假(传回值不为0),就进入循环。
行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。
行4,回到行1,执行until命令

1.41:计算1-20的和

通过循环累计的方式计算1-20的和
until跟whlie相反是命令不成立就会进入循环=whlie前面加!

#!/bin/bash
k=1
s=0
until [ $k -eq 11 ]     #当取值为21就会成立就不会进入循环'
do
 let s+=$k
 let k++
done
echo "和:$s"
[root@server1 ~]# sh b.sh 
和:55

1.42:until语句应用

为指定用户发送在线消息

  • 若指定用户不在线(未登陆系统),则每10分钟(实验中为了测试效果,可改为5s)试一次,直至用户登录系统后再发送信息
  • 用户名与消息通过为止参数传递给脚本
#!/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 5
done
------------------------------------------------


`basename $0`值显示当前脚本或命令的名字
Message:定义发送内容
oot@localhost opt]# bash test.sh 
Usage:test.sh <username> [<message>]
#测试不存在用户
[root@localhost opt]# sh test.sh sushan
用户不存在
#用户不在线时
[root@localhost opt]# ./mes.sh sushan
用户不在线,正在尝试连接
用户不在线,正在尝试连接
用户不在线,正在尝试连接

准备了好多天肝了出来
如果觉得对您有用的话,点个赞再走吧!!!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服