Shell脚本-循环基础

Shell脚本-循环基础

背景:

正在学习Shell脚本之循环,发现Shell的循环和其他编程语言大同小异,逻辑上都是相通的,但在使用格式上却有点不同,在学习完Shell循环后,将学习的心得体会记录下来,以备今后复习。

介绍:

什么是Shell脚本:

      shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。

      shell script就像早期dos年代的.bat,将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script还提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。

Shell–for循环

格式1:

格式:for name [in words …] ; do COMMANDS;done

其中for为关键字,表示下面是使用的for循环

name是循环时使用的名字,它代表被循环列表里的具体值。在循环体里,我们不知道系统循环到哪了,也就不知道具体值是什么,所以需要一个统一的名字来代表这个值,而这里的name就是代表这个值的,它的名字是可以自己随意取的,但是要避开使用一些系统关键字和保留字。

in words … 代表使用的循环列表,可以是一串字符也可以是数组,如for name in word1 word2 word3 …,其中in是关键字,如果后面有循环列表就需要使用in。

do COMMANDS :其中do是关键字,表示后面是循环执行的命令,COMMANDS代表命令集合,可以是多个命令

done代表循环结束

如果这些代码是写在一行的,需要用”;”来分开,如果是分行写可以不用加”;”,后面会有列子供参考。

例子1:

for i in zhangsan lisi wangwu;do
        echo your name is $i
done

输出效果:

Shell脚本-循环基础

例子2:

for i in {1..10};do
     echo number is $i
done

输出效果:

Shell脚本-循环基础

例子3:

 for i in `seq 10`;do #循环10次,seq 10命令表示1到10
          useradd user$i #添加用户
          echo user$i is created #提示用户添加
          password=`tr -dc 'a-zA-Z0-9' < /dev/urandom |  head -c 8` #随机生成8位数密码
          echo user$i:$password >> /root/user.log #将密码写入日志文件
          echo $password | passwd --stdin "user$i" &> /dev/null #为用户添加密码
  done #结束
  unset password #释放变量password

输出效果:

Shell脚本-循环基础

生成的密码:

Shell脚本-循环基础

格式2:

格式:for (( exp1; exp2; exp3 )); do COMMANDS; done

这个用法和C语言的for循环差不多,不过这里用两个()括起来

exp1表示循环的起始值

exp2表示循环执行的条件,满足条件则执行,不满足则退出循环

exp3表示循环成功执行后的操作

其他的和第一种格式是一样的

例子:

for ((i=0;i<10;i++));do
      echo number is $i
done

输出效果:

Shell脚本-循环基础

Shell循环–while

格式:

格式:while COMMANDS; do COMMANDS; done

其中while为关键字,表示后面使用while循环

COMMANDS表示循环执行条件,COMMANDS结果为true时执行循环,为false则退出循环

do COMMANDS 表示循环执行的命令集

done 表示循环结束

例子:

i=0 #初始化i
while [ $i -lt 10 ];do #当i 小于10时执行循环体里的命令
      echo $i #输出 i 的值
      let i++ # i+1
done #结束

输出效果:

Shell脚本-循环基础

从while的格式可以看出,while更适合循环次数不确定的场合,因为只要是true,while就不会停止。这样就可以做一个死循环。

while true;do #true表示真,
      echo godai
done

执行这个脚本会一直输出gidai,直到我们强行结束这个脚本。

原创文章,作者:657188918,如若转载,请注明出处:http://www.178linux.com/85359

(0)
657188918657188918
上一篇 2017-08-26 09:23
下一篇 2017-08-26 12:26

相关推荐

  • 马哥教育网络第21期-第1周课程练习

    第一周博客 1、描述计算机的组成及其功能。 计算机的组成:运算器、控制器、储存器、输入设备、输出设备 运算器+控制器 = CPU 储存器 = RAM(内存) I/O(输入/输出)设备 = 硬盘、打印机、鼠标、键盘、显示器 CUP:运算和逻辑运算 储存器:缓存和储存数据 I/O设备:计算机与用户交互的设备 2、按系列罗列Linux的发行版,并描述不同发行版之间…

    Linux干货 2016-06-26
  • 网卡别名与bonding配置

    我们知道,一般来说,一个硬件地址对应与一个IP地址。但在一些情况下,我们可以通过一些方法打破硬件地址与IP地址的一一对应关系。下面就来说一下网卡别名与bonding配置。 网卡别名就是将多个IP地址绑定到一个网络接口上,其命名方式为IFACE:num,如eth0:1等。需要注意的是,网卡别名仅对虚拟主机有效。创建网卡别名有两种方式: 1、ifconfig命令…

    Linux干货 2016-09-05
  • nginx rewrite实战

    nginx rewrite实战 nginx rewrite实战 nginx rewrite实战 nginx rewrite 正则表达式匹配 多目录转成参数 目录对换 目录自动加“/” ,这个功能一般浏览器自动完成 禁止htaccess 禁止多个目录 禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求 禁止单个文件 给favic…

    Linux干货 2016-11-17
  • lvs的四种调度类型和调度算法介绍

    lvs是linux内核级的负载均衡解决方案,作为netfilter的补充套件,其工作在INPUT hook上。 相比nginx等负载均衡解决方案的差异如下: lvs工作于内核空间,不受用户空间套接字和端口数量的限制,而且所有调度工作在内核空间完成,效率更高; nginx为七层负载均衡器,虽然通过stream模块也可以做到四层负载均衡,但是受到套接字数量限制,…

    Linux干货 2017-06-25
  • 内核参数修改 内核编译 第14天

    Linux内核:单内核,模块化 内核的某些模块 编译进内核本体 [*] 编译成内核模块 [M] 不选择使用     [ ] 内核的组成部分 /boot/vmlinuz-VERSION /lib/modules/VERSION/ *.ko 模块间有可能有依赖关系 内核模块管理 lsmod:显…

    Linux干货 2016-01-18
  • 软件包管理利器之一&RPM

      概述:我们知道使用源代码进行软件编译可以具有定制化的设置,但对于Linux distribution的发行商来说,则有软件管理不易的问题,毕竟不是每个人对于操作系统都非常的熟悉,不是每个人都会进行源代码编译的,因此如果能够将软件现在相同的硬件与操作系统上编译好才发行的话,如果再加上简易的安装/删除/管理等机制,则对于软件管理会简单的多…

    Linux干货 2016-08-24