shell脚本的使用与实践4

avatar
作者
猴君
阅读量:0

1.for循环

循环类型有很多,现在广泛使用的for,while循环,还有until,select循环,本单元讲for循环(

(1)格式1:

for循环在日常有两种,一种是定义变量值或读取某个文件的变量值,另一种写法是不设定值,以传参的方式写入值

1. for name in 值

do

   命令序列

done

说明:取值执行下面命令序列的命令,值有多少个,这个do,done之间的命令就是执行 多少个

列:

#!/bin/bash for i in 1 2 3   do      echo "helloword"   done 

显示结果为三个helloword,就是反复执行了三次命令序列的命令

(2)我们再看一下下一个列子

#!/bin/bash for i in 1 2 3 do   echo $i done

显示结果为1,2,3,这是 因为命令序列中输出i的值,我们I的值为1 2 3,所以输出也是1,2,3

注:这里值名称不一定是i,也就是说这个i不是死的,你也可以写yxadsd都可以的

(2)格式2

for i

do

   命令序列

done

说明:这个格式不需要给他赋值,这种方式往往都是引用外部的值,什么意思呢,看一下简单的列子

#!/bin/bash for i  do     echo $i  done  #我们运行此脚本,注意的是我们需要给他赋值,比如这个脚本的名字叫1.sh #sh 1.sh hello hi thank #输入这个三项值之后屏幕上显示hello,hi,thank,那有些朋友会想这不一点用都没有吗,输出的值还不是我写入的值,但是实际上我们使用脚本的时候这种传参的方式使用与批量做某件事情,在案列中提及实际生活中使用的方法

思考:那我们可以用for循环能不能实现做九九乘法表呢?

2.案列 

(1)批量生成指定的账户(有两种,一种是引入文件,取文件中的值,一种是自己定义值,后面会说怎么引入文件取批量创建用户,这里表示自定义值)

自定义值有两种方法,是for的两种格式,第一种格式是直观,但是如果用户 不同的话需要反复改脚本,所以第一种写法是日常中用于固定的格式。我们简单的写一下怎么批量创建用户,这里简单写了嵌套,后面会详细解释

#!/bin/bash #首先我们要准备需要创建的账号,我们在user.txt文件中想要创建的账号  for i in `cat user.txt`  do     if [ id $i &>dev/null ];then       echo "此账号已存在"      else         useradd $i         echo "123"|passwd --stdin $i     if done

(2)作为网络运维的经常会碰到机器之间能不能ping通的检查,下面简单的演示一下

#!/bin/bash #比如你要192.168.1.1到192.168.1.254的机器确认Ping通性的时候 ip_net="192.168.1" for i in {1..254}    do       ping -c2 -i0.3 -W1 $ip_net.$i &>dev/null       if [ $? -eq 0 ];then        echo "能ping成功"       else         echo "无法ping通"      fi   done

思考:假如不是1~254,而是间断性的IP的话这个脚本该怎么改呢,欢迎各位大神评论区写下珍贵的笔墨

3.while循环

while循环的作用跟for循环作用是一样的,while循环可以理解为 if跟for循环的结合体。

但是跟for循环不同在于while循环条件一但写错将出现死循环的状态,而且条件满足将无限循环来回执行,或提前结束。

格式为

while 条件判断

      do

          命令序列

    done

说明:while循环首先对上面的条件做出判断,当判断回值为0的时候会执行命令序列下的条件,然后再返回原来的条件判断,若还是为真,再执行命令序列下的条件,直到条件判断为假为止,看一下下面简单的列

#!/bin/bash i=2 while [ $i -le 5 ]  do     echo "hello" done  #如果执行上面脚本的话将是死循环,为什么呢,因为i的值为2,而条件是2小于5的时候执行输出echo,但是2是永远小于5的,所有输出echo就不会停止,一直到服务器崩溃为止,这种在实际生产上是很严重的事故

为了防止这种错误出现我们往往要考虑怎么样才能不满足条件,把上面的脚本改一下变成正常的脚本

#!/bin/bash i=2 while [ $i -le 5 ]  do     echo "hello"     echo "$i"      let i++ done  #执行这个脚本hello出现四次,并且显示i的值,当循环4次之后i的值达到5

再演示一下跟上面脚本差不多的,但是实际上结果并不一样 

#!/bin/bash i=2 while [ $i -le 5 ]  do     echo "hello"      let i++      echo "$i" done  #细心的大佬们已经注意到了,把echo放在下面了,看似差不多,实际上结果相差很远,这个脚本执行结果是输出 hello三次,所以我想在这里说的是虽然在同一个循环中但是执行顺序会直接影响脚本的结果

相信各位对循环有一定的 了解了,那我们现在开始写即又是小时候的难题也是很经典的循环列子

如果我们从1开始加到100,这个脚本该怎么写呢,下面我来简单的演示一下

#!/bin/bash sum=0 i=1 while [ $i -le 100 ]     do      let sum+=$i      let i++     done echo -e "\e[033m总和为:$sum\e[0m"  #结果是5050,可以仔细的看一下脚本是怎么运行的 #再看看下面脚本  sum=0 i=1 while [ $i -le 100 ] do      let sum+=$i      let i++ done echo -e "\e[033m总和为:$sum\e[0m"  #如果执行这个脚本的话会报错,报符号的问题,但实际的上跟符号一点关系都没有 ,看着跟上面的一模一样啊,为什么会报错呢. #这是因为while下面写了do,如果在同一列写入的话说明等级一样,所以bash 解释器会把do看成另外一个循环,导致运行错误,这种问问经常出现在写嵌套脚本的时候

说到这里有些朋友会认为是不是while后面一定是判断条件呢,是别的行不行

答案是肯定的。只要 while后面的返回值为真就可以,下面我来简单介绍一下

#!/bin/bash while ps aux|grep nginx   do      echo "nginx进程存在"   done  #当然如果nginx进程真存在,这个是死循环。但是在这里强调的是while后面就只能是判断条件,凡是返回值为 真,都可以执行

各位有什么好的循环脚本呢,欢迎在评论区留言

4.until循环

until循环方式刚跟while循环相反,有点反人类,它是返回为假的时候才会执行循环,返回为真的话立即停止脚本,所以现在生产山绝大部分都用while,这个循环也只有少部分的人在使用

格式为

until 条件

do

    命令序列

done

我们来举例它的循环有多反人类

#!/bin/bash i=3 until [ $i -ge 5 ]   do      let i++ done  #说明:i的值本来就小于5,条件上写的i的值大于5,那这个结果是假的,3肯定是小于5,所以返回为假,假的话就执行do和done之间的命令序列,说到这里是不是感觉这个循环有点反人类呢

5.select循环

select循环是用来做菜单的,跟case搭配使用,功能跟case一样,如果一定说不一样的话select循环可以快速的创建菜单,不需要那么多定义,在实际上这个语法也不广泛使用,在这里就不举例了

知道有这个存在就行了

    广告一刻

    为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!