1. shell流程控制

  流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。

2. if语句

  格式:if list; then list; [ elif list; then list; ] ... [ else list; ] fi

2.1  单分支

  if 条件表达式; then

  命令

  fi

  1. [root@localhost ~]# vim test.sh
  2. #!/bin/bash
  3. if [ -eq ];then
  4. echo "yes"
  5. fi
  6. [root@localhost ~]# bash test.sh
  7. yes

2.2 双分支

  if 条件表达式; then

  命令

  else

  命令

  fi

  1. #!/bin/bash
  2. if [ -eq ];then
  3. echo "yes"
  4. else
  5. echo "no"
  6. fi
  7. [root@localhost ~]# bash -x test.sh #-x,调试
  8. + '[' -eq ']'
  9. + echo no
  10. no
  1. #判断crond进程是否正在运行
  2. [root@localhost ~]# ps aux | grep "grep"
  3. root 0.0 0.0 pts/ S+ : : grep --color=auto
  4. [root@localhost ~]#vim cron_d.sh
  5. #!/bin/bash
  6. NAME=crond
  7. NUM=$(ps aux | grep $NAME | grep -vc grep)
  8. if [ $NUM -eq ]; then
  9. echo "$NAME running."
  10. else
  11. echo "$NAME is not running!"
  12. fi
  1. #检查主机是否在线
  2. #!/bin/bash
  3. if ping -c 192.168.1.1 &>/dev/null; then #if可以直接对命令进行判断
  4. echo "OK."
  5. else
  6. echo "NO!"
  7. fi

2.3 多分支

  if 条件表达式; then

  命令

  elif 条件表达式; then

  命令

  else

  命令

  fi

  1. #!/bin/bash
  2. N=$ # 接收用户输入参数
  3. if [ $N -eq ]; then
  4. echo "eq 3"
  5. elif [ $N -eq ]; then
  6. echo "eq 5"
  7. elif [ $N -eq ]; then
  8. echo "eq 8"
  9. else
  10. echo "no"
  11. fi

如果第一个条件符合就不再向下匹配。

在写脚本时先在命令测试,无误后再写入脚本

if语句实例:编写一个计算器,实现简单的加减乘除

  要求:

  请输入一个数字: 7

  请输入运算符:+

  请输入第二个数字:7

  7+7=14

  1. [root@localhost ~]# vim count.sh
  2. #!/bin/bash
  3. read -p "请输入第一个数字:" num1
  4. read -p "请输入运算符:" cha
  5. read -p "请输入第二个数字:" num2
  6. count (){
  7. echo "${num1}${cha}${num2}=$((${num1}${cha}${num2}))"
  8. }
  9. error () {
  10. echo "Usage:$0 {+|-|*|/|0-9}"
  11. }
  12. if [ -n '$num1' -a -n '$hca' -a -n '$num2' ];then
  13. if [ "$cha" == "+" ];then
  14. count
  15. elif [ "$cha" == "-" ];then
  16. count
  17. elif [ "$cha" == "*" ];then
  18. count
  19. elif [ "$cha" == "/" ];then
  20. count
  21. else
  22. error
  23. fi
  24. else
  25. echo '输入内容不能为空'
  26. fi
  27. :wq
  28. [root@localhost ~]# bash count.sh
  29. 请输入第一个数字:
  30. 请输入运算符:+
  31. 请输入第二个数字:
  32. +=
  33. [root@localhost ~]# bash count.sh
  34. 请输入第一个数字:
  35. 请输入运算符:*
  36. 请输入第二个数字:
  37. *=
  38. [root@localhost ~]# bash count.sh
  39. 请输入第一个数字:l
  40. 请输入运算符:l
  41. 请输入第二个数字:l
  42. Usage:count.sh {+|-|*|/|-}

3. for 语句

  用于批量化部署

  格式:for name [ [ in [ word ... ] ] ; ] do list ; done

    for 变量名 in 取值列表; do

    命令

    done
  
  或者

    for 变量名 in 取值列表

      do

      命令

    done

  1. [root@localhost ~]# vim for_test.sh
  2. #!/bin/bash
  3. for i in {..}
  4. do
  5. echo $i
  6. sleep #沉睡1秒,即1秒打印一个
  7. done
  8. :wq
  9. [root@localhost ~]# bash for_test.sh
  1. #实现100以内的偶数/奇数和
  2.  
  3. [root@localhost ~]#vim count_ou.sh
  4. #!/bin/bash
  5. sum=
  6. for i in `seq ` #偶数和
  7. do
  8. let sum+=$i
  9. done
  10. echo $sum
  11. :wq
  12. [root@localhost ~]# bash count_ou.sh
  13.  
  14. [root@localhost ~]# vim count_ji.sh
  15. #!/bin/bash
  16. sum=
  17. for i in `seq ` #奇数和
  18. do
  19. let sum+=$i
  20. done
  21. echo $sum
  22. :wq
  23. [root@localhost ~]# bash count_ji.sh
  1. #批量检查当前教室192.168.16.(1-10)网段主机是否在线
  2. [root@localhost ~]# vim check_ip.sh
  3. #!/bin/bash
  4. . /etc/init.d/functions #引用文件
  5. ip=192.168..
  6. for i in {..}
  7. do
  8. if ping -c -w $ip$i &>/dev/null;then #返回执行结果0或1,其他文件导入黑洞文件
  9. echo -n "$ip$i" #-n,不换行
  10. success #相应function函数
  11. echo "" #输出空格
  12. else
  13. echo -n "$ip$i"
  14. failure
  15. echo
  16. fi
  17. done
  18. [root@localhost ~]# bash check_ip.sh
  19. 192.168.16.1 [ OK ]
  20. 192.168.16.2 [ OK ]
  21. 192.168.16.3 [FAILED]
  22. 192.168.16.4 [FAILED]
  23. 192.168.16.5 [FAILED]
  24. 192.168.16.6 [FAILED]
  25. 192.168.16.7 [FAILED]
  26. 192.168.16.8 [FAILED]
  27. 192.168.16.9 [FAILED]
  28. 192.168.16.10 [FAILED]

4. while语句用于监控

  条件为真就进入死循环;条件为假就退出循环

    格式:while list; do list; done

  while 条件表达式; do

     命令

  done

  1. [root@localhost ~]# vim while_.sh
  2. #!/bin/bash
  3. n=
  4. while [ $n -lt ]
  5. do
  6. echo "$n"
  7. let n++
  8. done
  9. :wq
  10. [root@localhost ~]# bash while_.sh

  当条件表达式为 false 时,终止循环。

  条件表达式为 true,将会产生死循环。

  死循环有什么作用那?

  可以用来后台运行检测脚本,如下是是一个检测脑裂的脚本

  我们只需要在命令行中输入 nohup bash naolie.sh & 即可在后台持续运行该脚本

  1. #检测终端数量
  2. [root@localhost ~]# vim check_zh.sh=
  3. #!/bin/bash
  4. while true
  5. do
  6. num=`who | wc -l`
  7. echo"当前终端数量为$num"
  8. sleep
  9. done
  10. :wq
  11. [root@localhost ~]# bash check_zh.sh
  12. 当前终端数量为5
  13. 当前终端数量为5
  14. 当前终端数量为6
  15. 当前终端数量为6
  16. ^C
  17.  
  18. #关掉该终端后停止检测
  19. #将检测文件写入文件并放在后台执行
  20. [root@localhost ~]# vim check_zh.sh
  21. #!/bin/bash
  22. while true
  23. do
  24. num=`who | wc -l`
  25. echo "当前终端数量为$num" >> /root/check_zh
  26. sleep
  27. done
  28. :wq
  29. [root@localhost ~]# bash check_zh.sh & #&表示放在后台
  30. []
  31. [root@localhost ~]# tail -f check_zh
  32. 当前终端数量为3
  33. 当前终端数量为3
  34. …..

  35. #关闭写入检测文件的该终端,监测终端停止
  36. #若想关闭终端继续检测,将该监测文件挂起
  37. [root@localhost ~]# nohup bash check_zh.sh &
  38. []
  39. [root@localhost ~]# nohup: ignoring input and appending output to nohup.out’[root@localhost ~]# ls
  40. nohup.out #生成nohup.out文件
  41. 在监测则在该终端关闭后无影响
  42. [root@localhost ~]# tail -f check_zh
  43. 当前终端数量为3
  44. 当前终端数量为3
  45. 当前终端数量为2
  46. 当前终端数量为2
  47. …….

  48. #若要关掉该监测2关掉运行的进程即可
  49. [root@localhost ~]# ps aux | grep check_zh
  50. root 0.0 0.1 ? S : : bash check_zh.sh
  51. root 0.0 0.1 pts/ S : : bash check_zh.sh
  52. root 0.0 0.0 pts/ R+ : : grep --color=auto check_zh
  53. [root@localhost ~]# kill -
  54. [root@localhost ~]# kill -
  1. #逐行读取passwd文件
  2. [root@localhost ~]# vim read.sh
  3. #!/bin/bash
  4. cat /etc/passwd | while read line
  5. do
  6. echo "$line"
  7. sleep
  8. done
  9. :wq
  10. [root@localhost ~]# bash read.sh
  11. root:x:::root:/root:/bin/bash
  12. bin:x:::bin:/bin:/sbin/nologin
  13. daemon:x:::daemon:/sbin:/sbin/nologin
  14. adm:x:::adm:/var/adm:/sbin/nologin

5. break和continue语句

  break 是终止循环。

  continue 是跳出当前循环。

  1. [root@localhost ~]# vim test_break.sh
  2. #!/bin/bash
  3. sum=
  4. while true
  5. do
  6. if [ $sum -eq ];then
  7. break
  8. fi
  9. let sum++
  10. echo "$sum"
  11. done
  12. :wq
  13. [root@localhost ~]# bash test_break.sh
  1. [root@localhost ~]# vim test_continue.sh
  2. #!/bin/bash
  3. sum=
  4. while true
  5. do
  6. let sum++
  7. if [ $sum -eq ];then
  8. continue
  9. fi
  10. echo "$sum"
  11. sleep
  12. done
  13. :wq
  14. [root@localhost ~]# bash test_continue.sh
  15.  
  16. #跳过了5,仅跳出来此次循环
  17.  
  18. ^C

6. case语句(sentos6常用)

  case 语句一般用于选择性来执行对应部分块命令。

  case 模式名    in

  模式 1)

    命令

    ;;

  模式 2)

    命令

    ;;

  *)

     不符合以上模式执行的命令

  esac

  每个模式必须以右括号结束,命令结尾以双分号结束,最后一个模式不需要添加;;。

  1. [root@localhost ~]# vim test_case.sh
  2.  
  3. #!/bin/bash
  4. case $ in
  5. [-])
  6. echo "数字"
  7. ;;
  8. [a-z])
  9. echo "a-z"
  10. ;;
  11. [A-Z])
  12. a=`tr $ a-z` #大写转化成小写
  13. echo "$a"
  14. ;;
  15. *)
  16. echo "结束"
  17. esac
  18. :wq
  19. [root@localhost ~]# bash test_case.sh
  20. 数字
  21. [root@localhost ~]# bash test_case.sh a
  22. a-z
  23. [root@localhost ~]# bash test_case.sh A
  24. a-z
  1. #内存不足报警

  2. #查看内存
  3. [root@localhost ~]# free
  4. total used free shared buff/cache available
  5. Mem:
  6. Swap:
  7. [root@localhost ~]# free -h
  8. total used free shared buff/cache available
  9. Mem: 976M 116M 599M 6.7M 260M 681M
  10. Swap: 0B 0B 0B
  11. [root@localhost ~]# free -h | grep M
  12. Mem: 976M 116M 599M 6.7M 260M 681M
  13. [root@localhost ~]# free -h | grep M | cut -d'M' -f4
  14.  
  15. [root@localhost ~]# free -h | grep M | cut -d'M' -f4 | tr -d ' '
  16.  
  17. [root@localhost ~]# vim mem_warning.sh
  18. #!/bin/bash
  19. while true
  20. do
  21. mem=`free -h | grep M | cut -d'M' -f4 | tr -d ' '`
  22. if [ $mem -lt ];then
  23. echo '当前内存不足,请及时处理'
  24. break #警告一次即可
  25. fi
  26. done
  27. :wq

7. 实训

1> 写一个脚本: 实现自动化一键部署NFS服务器端和客户端

  1. #服务端:192.168.16.5;客户端:192.168.16.6
  2. .5
  3. [root@localhost ~]# vim nfs_auto_client.sh
  4. #!/bin/bash
  5. mount /dev/cdrom /mnt &>/dev/null
  6. yum install rpcbind nfs-utils -y &>/dev/null
  7. mkdir /zxj &>/dev/null
  8. mount -t nfs 192.168.16.6:/zxj /zxj
  9. df -h
    [root@localhost ~]# vim nfs_auto_server.sh
  10. #!/bin/bash
  11. #desc: This shell is for auto deploy nfs
  12. #date: --
  13. #author: zxj
  14.  
  15. #服务端配置
  16. pack_num=`ls /mnt | wc -l`
  17. if [ $pack_num -eq ];then
  18. mount /dev/cdrom /mnt &>/dev/null #检测是否挂载
  19. fi
  20. yum install rpcbind nfs-utils -y &>/dev/null
  21. if [ $? -ne ];then
  22. exit
  23. fi
  24. mkdir /zxj &>/dev/null
  25. chown -R nsfnabody: /zxj
  26. echo "/zxj 192.168.16.6(rw)" > /etc/exports
  27. systemctl restart rpcbind nfs &>/dev/null
  28.  
  29. #客户端配置
  30. scp ./nfs_auto_client.sh 192.168.16.5:/root
  31. ssh 192.168.16.6 bash /root/nfs_auto_client.sh
  32. [root@localhost ~]# bash nfs_auto_server.sh

2> 第二个脚本:实现批量化检测当前教室主机在线状况,在线主机保存至一个文件中

  1. [root@localhost ~]# vim check_online.sh
  2. #!/bin/bash
  3. touch online
  4. echo "在线ip:" > online
  5. ip=192.168..
  6. for i in {..}
  7. do
  8. if ping -c -w $ip$i &>/dev/null;then
  9. echo "$ip$i在线"
  10. echo "$ip$i" >> online
  11. else
  12. echo "$ip$i不在线"
  13. fi
  14. done
  15. cat online
  16. :wq
  17.  
  18. [root@localhost ~]# bash check_online.sh
  19. 192.168..5在线
  20. 192.168..6在线
  21. 192.168..7不在线
  22. 192.168..8不在线
  23. 192.168..9不在线
  24. 192.168..10不在线
  25. 192.168..11不在线
  26. 192.168..12不在线
  27. 192.168..13不在线
  28. 192.168..14不在线
  29. 192.168..15不在线
  30. 192.168..16在线
  31. 192.168..17不在线
  32. 192.168..18不在线
  33. 192.168..19不在线
  34. 192.168..20不在线
  35. 在线ip
  36. 192.168.16.5
  37. 192.168.16.6
  38. 192.168.16.16
  39.  
  40. #或者
  41. [root@localhost ~]# vim check_online.sh
  42. #!/bin/bash
  43. touch online
  44. echo "在线ip:" > online
  45. ip=192.168..
  46. . /etc/init.d/functions
  47. for i in {..}
  48. do
  49. if ping -c -w $ip$i &>/dev/null;then
  50. echo -n "$ip$i"
  51. success
  52. echo ""
  53. echo "$ip$i" >> online
  54. else
  55. echo -n "$ip$i"
  56. failure
  57. echo ""
  58. fi
  59. done
  60. cat online
  61. [root@localhost ~]# bash check_online.sh
  62. 192.168.16.5 [ OK ]
  63. 192.168.16.6 [ OK ]
  64. 192.168.16.7 [FAILED]
  65. 192.168.16.8 [FAILED]
  66. 192.168.16.9 [FAILED]
  67. 192.168.16.10 [FAILED]
  68. 192.168.16.11 [FAILED]
  69. 192.168.16.12 [FAILED]
  70. 192.168.16.13 [FAILED]
  71. 192.168.16.14 [FAILED]
  72. 192.168.16.15 [FAILED]
  73. 192.168.16.16 [ OK ]
  74. 192.168.16.17 [FAILED]
  75. 192.168.16.18 [FAILED]
  76. 192.168.16.19 [FAILED]
  77. 192.168.16.20 [FAILED]
  78. 在线ip
  79. 192.168.16.5
  80. 192.168.16.6
  81. 192.168.16.16

3> 第三个脚本:实现批量化创建100个用户,并创建8位随机密码,且可登陆

  1. #!/bin/bash
  2. for i in {..}
  3. do
  4. useradd user$i
  5. passwd=`echo $RANDOM | md5sum | cut -c -`
  6. echo $passwd | passwd --stdin user$i
  7. echo -e "账户:user$ \n密码:$passwd"
  8. done

4> 第四个脚本:找出系统中含有某个关键词的文件,并输出到终端,关键词用户输入指定

  1. [root@localhost ~]# vim find_key.sh
  2. #!/bin/bash
  3. read -p "Please input your keyword:" key
  4. for file in `find / -type f``
  5. do
  6. if grep "$key" $file &>/dev/null;then
  7. echo "$file"
  8. fi
  9. done
  10. :wq
  11. [root@localhost ~]# bash find_key.sh
  12. Please input your keyword:anaconda
  13. /boot/grub2/device.map
  14. ……

5> 第五个脚本:批量判断当前目录下所有文件类型

  1. [root@localhost ~]# vim type.sh
  2. #!/bin/bash
  3. for file in `ls /root`
  4. do
  5. type=`ls -ld $file | cut -c `
  6. if [ "$type" == "-" ];then
  7. echo "$type------->$file=====普通文件"
  8. elif [ "$type" == "d" ];then
  9. echo "$type------->$file=====目录文件"
  10. elif [ "$type" == "l" ];then
  11. echo "$type------->$file=====链接文件"
  12. else
  13. echo "$type------->$file=====未知文件"
  14. fi
  15. done
  16. :wq
  17. [root@localhost ~]# bash type.sh
  18. -------->anaconda-ks.cfg=====普通文件
  19. -------->find_key.sh=====普通文件
  20. -------->type.sh=====普通文件

6> 找到以.sh结尾的文件,计算文件大小总和,以KB为单位

  1. #方法一: 用cut分割
  2. [root@localhost ~]# vim sum_sh.sh
  3. #!/bin/bash
  4. sum=
  5. for file in `find / -name "*.sh"`
  6. do
  7. size=`ls -l $file | cut -d " " -f `
  8. let sum+=$size
  9. done
  10. echo "$(($sum/1024))KB"
  11. [root@localhost ~]# bash sum_sh.sh
  12. 623KB
  13.  
  14. # 方法二:用awk分割
  15. [root@localhost ~]# vim sum_sh1.sh
  16. #!/bin/bash
  17. sum=
  18. for file in `find / -name "*.sh"`
  19. do
  20. size=`ls -l $file | awk -F " +" '{printf $5}'`
  21. let sum+=$size
  22. done
  23. echo "$(($sum/1024))KB"
  24. :wq
  25. [root@localhost ~]# bash sum_sh1.sh
  26. 623KB

Shell流程语句的更多相关文章

  1. shell流程语句使用介绍

    1)使用if.case.read例子1:#!/bin/bash#读取终端输入的字符read -p "Please input a Number:" nn1=`echo $n|sed ...

  2. linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载

    http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...

  3. [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例

    原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...

  4. [shell]流程控制----case语句

    Shell case语句为多选择语句.可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: case 值 in 模式1) command1 command2 ...

  5. linux shell 流程控制

    导读 和Java.PHP等语言不一样,linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case).下面我将通过例子介绍下,各个语句使 ...

  6. Shell 流程控制-if for case while until break continue

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  7. 九、Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  8. 吴裕雄--天生自然ShellX学习笔记:Shell 流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  9. 第七课第一节,T语言流程语句( 版本5.0)

    流程语句 if语句 用if语句可以构成分支结构.它根据给定的条件进行判断,以决定执行某个分支程序段.TC综合开发工具的if语句有三种基本形式,并且每个语句的结尾都要有一个end (注:关键字,if,e ...

随机推荐

  1. 基础BFS+DFS poj3083

    //满基础的一道题 //最短路径肯定是BFS. //然后靠右,靠左,就DFS啦 //根据前一个状态推出下一个状态,举靠左的例子,如果一开始是上的话,那么他的接下来依次就是 左,上 , 右 , 下 // ...

  2. bzoj 1003: [ZJOI2006]物流运输【spfa+dp】

    预处理出ans[i][j]为i到j时间的最短路,设f[i]为到i时间的最小代价,转移显然就是 f[i]=min(f[j-1]+ans[j][i]*(i-j+1)+k); #include<ios ...

  3. zabbix自定义item(v3.4)

    1 添加user key agent.conf UnsafeUserParameters=1 UserParameter=mysql_if_running,sh /app/zabbix/alertsc ...

  4. April Fools Contest 2017 E

    Description Input The input consists of four lines, each line containing a single digit 0 or 1. Outp ...

  5. JAVA常用知识总结(二)

    JAVA中的参数传递总结先看两道笔试题: public class Test2 { public static void main (String [] args) { StringBuffer a ...

  6. K-th Number 线段树的区间第K大

    http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...

  7. Linux上不了网——wget无法解析主机

    很有可能是网关和域名服务器没有设置 1.设置网关 netstat -rn #查看网关配置情况 [hadoop@slave1 ~]$ route -n Kernel IP routing table D ...

  8. php服务端接收post的json数据

    最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post ...

  9. 【转】java序列化一定要应该注意的6个事项!

    1.如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常. 2.静态变量不会被序列化,那是类 ...

  10. logging模块基础

    很多程序都有记录日志的需求,日志不仅可以保存访问记录,也可以有错误,警告等信息输出. python的logging模块提供了标准的日志接口,可以通过logging存储各种格式的日志.logging模块 ...