Shell编程——流程控制case、循环语句

目录

1.流程控制语句:case

2.循环语句

(1)for----do-----done

1)取值列表有多种取值方式

2)列表中的复杂值

3)从变量中取值

4)从命令中取值

5)自定义shell分隔符

(2)C语言风格的for

(3)whlie-----do------done

(4)嵌套循环

1)批量添加a.txt文件5个用户

2)打印九九乘法表

3.3个shell脚本实战

实战1

实战2

实战3


1.流程控制语句:case

控制语句:用来实现对程序流程的选择、循环、转向和返回等进行控制。

case是开关语句的一个组成部分;

它是根据变量的不同进行取值比较,然后针对不同的取值分别执行不同的命令操作

适用于多分支,是一个多选择语句

case     变量或表达式     in

              变量或表达式1)

                     命令序列1

                     ;;

            变量或表达式2)

                     命令序列2

                     ;;

                     ……

                     *)  

                     默认命令序列

 esac

执行流程:

  •     首先使用“变量或表达式”的值与值1进行比较,若取值相同则执行值1后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示分支结束;
  •     若与值1不相匹配,则继续与值2 进行比较,若取值相同则执行值2 后的命令序列,直到遇见双分号“;; ”后跳转至esac,表示结束分支。
  •     依次类推,若找不到任何匹配的值,则执行默认模式“ *) ”后的命令序列,直到遇见esac后结束分支
  •     注意事项:

               1.“变量或表达式”后面必须为单词in,每一个“变量或表达式”的值必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 

               2. 匹配中的值可以是多个值,通过“|”来分隔

示例1:

case_1.sh脚本:

Shell编程——流程控制case、循环语句_第1张图片

运行结果:

Shell编程——流程控制case、循环语句_第2张图片

示例2:编写一个启动apache服务脚本

case2.sh脚本:

Shell编程——流程控制case、循环语句_第3张图片

运行结果:

Shell编程——流程控制case、循环语句_第4张图片

2.循环语句

(1)for----do-----done

语法格式:

for var in list

do

  commands

done

或:

for var in list ; do

  commands

done

1)取值列表有多种取值方式

可以直接读取in 后面的值,默认以空格做分隔

Shell编程——流程控制case、循环语句_第5张图片

Shell编程——流程控制case、循环语句_第6张图片

2)列表中的复杂值

可以使用 引号或转义字符/来加以约束

Shell编程——流程控制case、循环语句_第7张图片

Shell编程——流程控制case、循环语句_第8张图片

Shell编程——流程控制case、循环语句_第9张图片

Shell编程——流程控制case、循环语句_第10张图片

3)从变量中取值

Shell编程——流程控制case、循环语句_第11张图片

Shell编程——流程控制case、循环语句_第12张图片

4)从命令中取值

Shell编程——流程控制case、循环语句_第13张图片

Shell编程——流程控制case、循环语句_第14张图片

5)自定义shell分隔符

默认情况下,base shell会以空格、制表符、换行符做为分隔符。通过IFS来自定义为分隔符

指定单个字符做分隔符:

IFS=:   #以:冒号做分隔符

可以指定多个

如 IFS='\n':;"     #这个赋值会将反斜杠、n、冒号、分号和双引号作为字段分隔符。

注:$'\n'与'\n'时的区别

IFS='\n'    #将字符\和字符n作为IFS的换行符。

IFS=$'\n'   #真正地使用换行符做为字段分隔符。

Shell编程——流程控制case、循环语句_第15张图片

Shell编程——流程控制case、循环语句_第16张图片

Shell编程——流程控制case、循环语句_第17张图片

(2)C语言风格的for

语法格式:

for ((i=0;i<10;i++))

do

   commmands

done

示例1:单个变量。 输出1到10之间的数字

Shell编程——流程控制case、循环语句_第18张图片

Shell编程——流程控制case、循环语句_第19张图片

示例2:多个变量。 同时输出1-9的升序和降序

Shell编程——流程控制case、循环语句_第20张图片

Shell编程——流程控制case、循环语句_第21张图片

(3)whlie-----do------done

重复测试指令的条件,只要条件成立就反复执行对应的命令操作,直到命令不成立或为假;

语法格式如下:

while 测试命令

do

命令

done

注意:

  •     避免陷入死循环  while true
  •     自增操作  let var++  
  •     自减操作  let var--  

 

示例1:降序输出10到1的数字

Shell编程——流程控制case、循环语句_第22张图片

Shell编程——流程控制case、循环语句_第23张图片

例2:输出如下图两数相乘的效果

Shell编程——流程控制case、循环语句_第24张图片

Shell编程——流程控制case、循环语句_第25张图片

Shell编程——流程控制case、循环语句_第26张图片

(4)嵌套循环

1)批量添加a.txt文件5个用户

Shell编程——流程控制case、循环语句_第27张图片

编写脚本的思路

  • 1  明确脚本的功能
  • 2  编写脚本时会使用到那些命令 ?  useradd    passwd   for
  • 3  把变化的数据使用变量表示
  • 4  选择适合的流程控制  (选择 、 循环 、分支)

Shell编程——流程控制case、循环语句_第28张图片

Shell编程——流程控制case、循环语句_第29张图片

2)打印九九乘法表

Shell编程——流程控制case、循环语句_第30张图片

Shell编程——流程控制case、循环语句_第31张图片

3.3个shell脚本实战

实战1

将/opt目录下所有的日志文件全自动打包

#!/bin/sh
SRC_DIR=/var/log/
DES_DIR=/opt/backup/`date +%Y%m%d`
if
[ ! -d  $DES_DIR ] ; then
        mkdir -p $DES_DIR
fi
for i in  `find  $SRC_DIR  -name "*.log"`
do
        tar  czf  $i.tgz  $i
done
mv /var/log/*.tgz $DES_DIR
ls -lh $DES_DIR
echo "The scripts exec end, Files tar successfully !"

Shell编程——流程控制case、循环语句_第32张图片

实战2

找出192.168.1.1-10网段中,服务器已经关机的IP地址

#!/bin/bash
i=1
for (( i=1;i<10;i++ ))
do
  ping  -c  3  192.168.1.$i &> /dev/null
  if  [ $? -ne 0 ];then
     echo 192.168.1.$i is shutdown
  fi
done

Shell编程——流程控制case、循环语句_第33张图片

实战3

批量创建帐号并生成随机密码

#!/bin/bash
for i in boboyu{1..10}
do
      useradd $i
      pass=`date +%s|md5sum|cut -c 1-8`
      sleep 1
      echo "$i:$pass" >> /tmp/passwd.log
      echo $pass |passwd --stdin $i > /dev/null 2>&1
      if [ $? -eq 0 ];then
        echo "create user is successfully!"
      else
        echo "create user is failed!"
      fi
done

Shell编程——流程控制case、循环语句_第34张图片

Shell编程——流程控制case、循环语句_第35张图片

你可能感兴趣的:(Shell编程)