shell学习之-程序的流程控制(1)

原创 2007年10月15日 16:40:00
shell编程学习

  1, shell程序的流程控制

  **条件测试语句if then fi
  全部的基本形式为:

  if xxxx; then
      xxx
  elif xxx; then
      xxx
  elsif xxx; then
      xxx
  else
      xxx
  fi

  条件语句有两种编写形式:
  *if xxx
  then
      xxx
  fi

  *if xxx; then
      xxx
  fi

  (1)简单的if then fi

  *******
  if [ "10" < "12" ]; then
      echo "yes"
  fi
  *******
  注意:这里的if和[间有一空格,参数和[间也有一个空格。而;和then间可以没有空格,表示继续执行后面的语句;

  (2)变量测试
  具体的变量测试的语法和比较的关键字,可以使用 man test 进行查询

  *****
  #!/bin/sh
  #testvar.sh

  echo "please input you name :"
  read NAME

  if [ "$NAME" = "" ]; then
      echo "you name is null"
  elif [ "$NAME" = "hover" ]; then
      echo "haha, It's me"
  else
      echo "You name is ${NAME}, welcome!"
  fi

  exit
  *****
  小结:当变量中含有空格或TAB时,必须用引号引起来。所以如果对变量进行测试,一般是要用引号引起来的。

  (3)对执行语句进行测试

  *****
  #!/bin/sh
  #test-express.sh

  echo "iput a string:"
  read STR

  if echo "$STR" | grep 'hover' &>/dev/null
  then
      echo "haha, I am here, I am ${STR}"
  else
      echo "I am not here"
  fi

  exit
  *****
  小结:
  *这里测试的表达是可以多种多样,而且可以测试与和或的表达式,具体的语法可以man test 进行查看。
  *在进行语句的测试时,如果需要避免错误信息或输出信息,需要用到重定向,具体的专门有专题讲解。

  (4)测试传递的参数

  *****
  #!/bin/sh
  #test-invar.sh

  #test paramter which user input

  printusage()
  {
      echo "usage : $0 [start|stop|restart]"
  }

  if [ $# -ne 2 ]; then
      printusage
  elif [ "$1" = "" ]; then
      printusage
  elif [ "$1" = "start" ]; then
      echo "start $0"
  elif [ "$1" = "stop" ]; then
      echo "stop $0"
  elif [ "$1" = "restart" ]; then
      echo "restart $0"
  else
      printusage
  fi

  exit
  *****
  小结:和C一样,shell编程中也可以传递参数。其中,$0 $1 ..$n 分别表示参数的第0个第1个第n个值。$#表示参数的个数。

  (5) : null参数
      : 表示true , 也表示什么都不做

  *****
  if [ -z "`ls $1`" ]
  then :
  else
      echo "not zero"
  fi

  *****

  (6) 多个if 的流程控制

  *****
  #!/bin/sh
  #mut-if.sh

  #测试使用多个if的情况
  if [ -z $HH ]; then
      echo "do you want to set HH"
      echo "enter [y/n]"
      read Y_N

      #now set HH
      if [ "$Y_N" = "y" ] || [ "$Y_N" = "Y" ]
      then
          echo "please input value :"
          read HH
          if [ -z $HH ]
          then :                 #HH is null do nothing
          else
              echo "now HH=${HH}"
          fi
      else
          HH=hover
          echo "no, then use default: $HH"
      fi

  else
      HH=hover
      echo "default value is $HH"
  fi

      echo "last HH=${HH}"
      unset HH
      echo "HH unseted, test finished"
  exit

  *****

  总结: if流程基本上就这么多,具体的用法要根据实际情况进行灵活应用。


  2,case 语句
  case 一种多开关语句,在测试具有多种值的变量时比if语句灵活。
  使用模式为:
  case 值 in
      模式1)
          命令1
      ;;
      模式2)
          命令2
      ;;
      *)
      命令n
  esac

  case先取值(记住取值的后面必须要有一个in),然后依次进行匹配模式n :
  如果有一个模式匹配,则执行相应的命令n,遇到;;结束,退出case语句。
  如果都不匹配,可以使用*来捕获该值,并从新接受输入。

  (1)简单的case应用
  *****
  #!/bin/sh
  #test-case.sh

  echo "input a number: "
  read NUM

  case $NUM in
  1) echo "111"
      ;;
  2) echo "22"
      ;;
  3) echo "33"
      ;;
  *)
      echo "no match"
  esac
  *****

  小结:这里只简单的使用了数字来进行测试,发散一下,如果是单词或多个单词,又该如何呢?

  (2)模式和多模式匹配的应用

  *****
  #!/bin/sh
  #test-case1.sh

  echo "Do you want to continue? [y/n|yes/no]"
  read ANS

  case $ANS in
  y|Y|yes|Yes|YES)
      echo "you can continue"
      ;;
  n|no|No|NO)
      echo "you stop"
      ;;
  *)
      echo "your input is wrong"

  esac

  *****

  小结:在匹配多模式时,模式可以以|链结表示“或”的意思。这样就可以进行多模式的匹配了。
由于是单模式的匹配,所以不存在“与”的模式。

  (3)测试命令参数

  *****
  #!/bin/sh
  #test-case1.sh

  if [ "$#" -ne "1" ]; then
      echo "please input one of [start|stop|restart]"
      exit 1
  fi

  VAR=$1
  case $VAR in
      start)
          echo "sart ... `basename $0`"
          ;;
      stop)
          echo "stop ... `basename $0`"
          ;;
      restart)
          echo "restar ... `basename $0`"
          ;;
      *)
          echo "input is wrong"
          ;;
  esac

  *****

  小结:先要对用户是否出入了命令参数进行检查,然后把第一个参数赋值给一个变量,然后进行处理。

  3,for 循环语句
  ==============

  for 循环语句的基本形式为:
      for arg [list]
      do
          命令
      done

  或
      for arg [list]; do
          命令
          ...
      done

  注意:在循环的每次执行中,arg将顺序的存取list中列出的变量.
  list中的参数允许包含通配符.

  (1)简单的for程序

  *****
  #!/bin/sh
  #test-for.sh

  #测试for语句

  for loop in 1 2 3 4 5 6
  do
      echo $loop
  done

  *****


  *****
  #!/bin/sh
  #test-for1.sh

  ll="a b c d e"
  for loop in $ll
  # for loop in "$ll"
  do
      echo $loop
  done

  *****

  注意:in $ll 和 in "$ll"的区别。前面是简单的替换,没有屏蔽空格,而后面才是完整的变量使用。

  (2)在[list]中使用通配符

  *****
  #!/bin/sh
  #test-for2.sh

  #list all file in local dir

  for t_dir in *
  do
      echo "$t_dir"
  done

  echo "=====list file whose name begin with j or s in local dir====="
  for t_dir1 in [ts]*
  do
      echo "$t_dir1"
  done

  *****

  (3)使用命令替换[list]

  ######
  #!/bin/bash
  #  for-loopcmd.sh: 带[list]的for循环
  #+ [list]是由命令替换产生的.

  NUMBERS="9 7 3 8 37.53"

  for number in `echo $NUMBERS`  # for number in 9 7 3 8 37.53
  do
    echo -n "$number "
  done

  echo
  exit 0
  #####


  (4)在命令行使用参数
      如果in [list]的值为空,那么默认的是使用参数传给for循环。

  #####
  for ll
  do
      echo $ll
  done
  #####


  4 until 循环结构(用的不多)
  ===================
  这个结构在循环的顶部判断条件,并且如果条件一直为false那就一直循环下去.(与while基本格式相反)

      until 条件
          命令1
          ...
      done
  注意:条件可以为任意测试条件,测试发生在循环末尾。循环至少执行一次。

  #########
  #!/bin/sh
  #test-until.sh

  #判断root是否已经登陆

  IS_ROOT=`who | grep root`
  until [ "$IS_ROOT" ]
  do
      sleep 2
  done
  echo "root have went in"

  exit

  #########

  5,while 循环结构(比较常用)
      这种结构在循环的开头判断条件是否满足,如果条件一直满足,那就一直循环下去(0为退出码).
与for循环的区别是,这种结构适合用在循环次数未知的情况下. 其基本的格式如下:

  while [condition]
  do
      command...
  done

  ######

  while [condition]; do
      command...
  done

  和for循环一样,如果想把do和条件放到同一行上还是需要一个";".

  (1)简单的while循环

  #########
  #!/bin/sh
  #test-while.sh


  N=0
  while [ $N -lt 5 ]
  do
      N=$( expr $N + 1 )      #或者N=`expr $N + 1`
      echo $N
  done

  #########

  (2)利用while读取文件

  #######
  #2 : read file using while
  while read LINE
  do
      echo $LINE
  done < t1.sh

  #######

  注意:在读取文件时,输入的格式最好使用以上的形式,而不要使用
      cat filename | while read LINE
  这样可能会出错。

  也可以用多个变量来保存多个域的项目
  ff.txt
  1 h
  2 hh
  3 hhh
  4 hhhh

  #####

  while read N NAME
  do
      echo $N $NAME
  done < ff.txt

  #####

  注意:这里使用的默认的IFS,如果要处理用:分隔的项目,可以把IFS设置成:然后再进行处理。
  如:
      IFS_BACK=$IFS
      IFS=:
      ***
      ***进行一些操作
      IFS=$IFS_BACK


  (3)统计文件中的记录

  文件ff的内容如下:
  h1 23
  h2 34
  h1 45
  h2 56
  h1 87
  要求计算h1的总和?

  ######
  #计算文件中的统计项目的总和

  RFILE=ff
  TOTAL=0
  CA_NAME="$1"

  echo "$#"
  if [ "$#" -ne "1" ]; then
      echo "usage : $0 <name>"
      exit 1
  fi

  while read NAME NUM
  do
      if [ "$NAME" = "$CA_NAME" ]; then
          TOTAL=`expr $TOTAL + $NUM`
      fi
  done < $RFILE

  if [ "$TOTAL" -eq "0" ]; then
      echo "$CA_NAME is not exit or $RFILE is worng"
  else
      echo "$CA_NAME total is $TOTAL"
  fi

  ######

  (4)在读文件时忽略特定行

  #remove the commet line
  re_com()
  {
      while read line
      do
          case $line in
          /#*|ITEM|"/n");;   #这里注意
          *)
              echo "data: $line"
          ;;
          esac
      done < data.txt
  }

  6,利用break和continue控制程序的流程

  (1)跳出case

  #!/bin/sh
  #t_break.sh

  #在死循环中如何跳出
  while :
  do
      echo "please input a number: "
      read NS
      case $NS in
      1|2|3|4|5)
          echo "great! you entered a number between 1 and 5"
          ;;
      *)
          echo "wrong, good bye!"
          break;
          ;;
      esac
  done

  而continue 语句和c语言中的continue语句有相同的用法。

  到此流程控制的基本用法就告一段落,而要灵活使用它们需要在实践中练习,练习,再练习。

      下面利用这些东西可以写一个简单的菜单,来给用户提供该系统的运行情况的信息。
就是一个系统状态汇报系统。包括系统的内存使用情况,CPU使用情况,磁盘空间的使用情况,
有哪用户已经登陆到该系统上,系统中有哪些进程,开启了哪些服务,该使用系统及其内核的版本.
第一步只需要把该系统做成单一的程序,而第二部可以使用crond服务作成实时监控定期报警的方式。


  7, 如何注释掉一段sh程序

  1)在vi中使用命令: %s/^/#/g
  2)在要注释的段前后加:
  <<BLOCK
  ...
  BLOCK
版权声明:本文为博主原创文章,未经博主允许不得转载。

Shell编程入门总结(一)

本文的主要内容: 1、编写Shell脚本的一般步骤 2、在Shell脚本中输出文本 3、Shell脚本中的变量 4、Shell脚本中的函数 5、流程控制:if 分支结构 6、Shell中读取键盘输入...
  • CSDN_SXL
  • CSDN_SXL
  • 2016年04月28日 21:55
  • 5296

shell学习(不错的简单学习教程)

shell脚本   Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管...
  • zhangdong305
  • zhangdong305
  • 2015年03月26日 15:09
  • 2965

JAVA基础知识: 流程控制习题答案

第一题: 有 36 人 36 块板砖,男人每人般 4 块,女人每人搬 3 块,小孩每 2 人搬 1 块。36 人都搬了一次,把砖刚好搬晚,问:几男几女的几个小孩? int na...
  • Spark2008
  • Spark2008
  • 2015年03月23日 09:19
  • 1665

程序的流程控制_2[1]

  • 2011年05月22日 23:02
  • 421KB
  • 下载

C51程序设计03语句及流程控制[1]

  • 2014年09月15日 16:02
  • 656KB
  • 下载

Shell 程序设计的流程控制

和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。与传统语言不同的是,Shell 用于指定条件值的不是布尔运算式,而...
  • zh2qiang
  • zh2qiang
  • 2011年09月15日 22:02
  • 339

Shell程序设计(二)—流程控制

和其他高级程序设计语言一样,shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令建立非常复杂的程序。   与传统的语言不同的是,shell用于指定条件值的不是布尔表达...
  • xia_xia0919
  • xia_xia0919
  • 2016年01月18日 17:12
  • 223

shell程序设计的流程控制及其命令分组

1、test测试命令 ①数值测试 · -eq:等于则为真 · -ne:不等于则为真 · -gt:大于则为真 · -ge:大于等于则为真 · -lt:小于则为真 · -le:小于等于则为真...
  • bv1315008634
  • bv1315008634
  • 2016年09月16日 13:01
  • 316

C语言5种程序语句(1)——流程控制语句中的结构化语句(条件语句和循环语句)

C语言有5种类型的语句: (1)表达式语句包括:运算符表达式语句、赋值语句。 (2)流程控制语句包括结构化语句和非结构语句; A.结构化语句包括:条件语句和循环语句;    a.条件语句包括:if语...
  • u010785142
  • u010785142
  • 2015年08月05日 21:33
  • 1525

Shell学习笔记(8)-流程控制之IF语句

流程控制 命令的结束状态     Bash Shell Script可由许多命令组成。每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值。执行失败,也分...
  • qian_348840260
  • qian_348840260
  • 2012年11月13日 10:49
  • 765
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell学习之-程序的流程控制(1)
举报原因:
原因补充:

(最多只允许输入30个字)