`
rorely
  • 浏览: 113320 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

shell程序设计的流程控制

阅读更多

Shell程序设计的流程控制

来源:转载 (2006-06-15 12:12:54)

和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。

  与传统语言不同的是,Shell用于指定条件值的不是布尔运算式,而是命令和字串。

  1.测试命令

  test命令用于检查某个条件是否成立,它可以进行数值、字符和文件3个方面的测试,其测试符和相应的功能分别如下。

  (1)数值测试:

  -eq 等于则为真。

  -ne 不等于则为真。

  -gt 大于则为真。

  -ge 大于等于则为真。

  -lt 小于则为真。

  -le 小于等于则为真。

  (2)字串测试:

  = 等于则为真。

  != 不相等则为真。

  -z字串 字串长度伪则为真。

  -n字串 字串长度不伪则为真。

  (3)文件测试:

  -e文件名 如果文件存在则为真。

  -r文件名 如果文件存在且可读则为真。

  -w文件名 如果文件存在且可写则为真。

  -x文件名 如果文件存在且可执行则为真。

  -s文件名 如果文件存在且至少有一个字符则为真。

  -d文件名 如果文件存在且为目录则为真。

  -f文件名 如果文件存在且为普通文件则为真。

  -c文件名 如果文件存在且为字符型特殊文件则为真。

  -b文件名 如果文件存在且为块特殊文件则为真。

  另外,Linux还提供了与(!)、或(-o)、非(-a)三个逻辑操作符,用于将测试条件连接起来,其优先顺序为:!最高,-a次之,-o最低。

  同时,bash也能完成简单的算术运算,格式如下:

  $[expression]

  例如:

  var1=2

  var2=$[var1*10+1]

  则var2的值为21。

  2.if条件语句

  Shell程序中的条件分支是通过if条件语句来实现的,其一般格式为:

  if 条件命令串

  then

  条件为真时的命令串

  else

  条件为假时的命令串

  fi

  3.for循环

  for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供,也可以在程序以外以位置参数的形式提供。for循环的一般格式为:

  for变量名    [in数值列表]

  do

  若干个命令行

  done

  变量名可以是用户选择的任何字串,如果变量名是var,则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in,则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。

  4.while和until循环

  while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为:

  while

  若干个命令行1

  do

  若干个命令行2

  done

  只要while的“若干个命令行1”中最后一个命令的返回状态为真,while循环就继续执行do...done之间的“若干个命令行2”。

  until命令是另一种循环结构,它和while命令相似,其格式如下:

  until

   若干个命令行1

  do

   若干个命令行2

  done

  until循环和while循环的区别在于:while循环在条件为真时继续执行循环,而until则是在条件为假时继续执行循环。

  Shell还提供了true和false两条命令用于创建无限循环结构,它们的返回状态分别是总为0或总为非0。

  5.case条件选择

  if条件语句用于在两个选项中选定一项,而case条件选择为用户提供了根据字串或变量的值从多个选项中选择一项的方法,其格式如下:

  case string in

  exp-1)

  若干个命令行1

  ;;

  exp-2)

   若干个命令行2

  ;;

  ……

  *)

  其他命令行

  esac

  Shell通过计算字串string的值,将其结果依次和运算式exp-1, exp-2等进行比较,直到找到一个匹配的运算式为止。如果找到了匹配项,则执行它下面的命令直到遇到一对分号(;;)为止。

  在case运算式中也可以使用Shell的通配符(“*”、“?”、“[ ]”)。通常用 * 作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行“其他命令行”的命令。

  6.无条件控制语句break和continue

  break用于立即终止当前循环的执行,而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。

  7.函数定义

  在Shell中还可以定义函数。函数实际上也是由若干条Shell命令组成的,因此它与Shell程序形式上是相似的,不同的是它不是一个单独的进程,而是Shell程序的一部分。函数定义的基本格式为:

  functionname

  {

   若干命令行

  }

  调用函数的格式为:

  functionname param1 param2…

  Shell函数可以完成某些例行的工作,而且还可以有自己的退出状态,因此函数也可以作为if, while等控制结构的条件。

  在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时Shell将把这些参数分别赋予相应的位置参数$1, $2, ...及$*。

  8.命令分组

   在Shell中有两种命令分组的方法:()和{}。前者当Shell执行()中的命令时将再创建一个新的子进程,然后这个子进程去执行圆括弧中的命令。 当用户在执行某个命令时不想让命令运行时对状态集合(如位置参数、环境变量、当前工作目录等)的改变影响到下面语句的执行时,就应该把这些命令放在圆括弧 中,这样就能保证所有的改变只对子进程产生影响,而父进程不受任何干扰。{}用于将顺序执行的命令的输出结果用于另一个命令的输入(管道方式)。当我们要 真正使用圆括弧和花括弧时(如计算运算式的优先顺序),则需要在其前面加上转义符(\)以便让Shell知道它们不是用于命令执行的控制所用。

  9.信号

  trap命令用于在Shell程序中捕捉信号,之后可以有3种反应方式:

  (1)执行一段程序来处理这一信号。

  (2)接受信号的默认操作。

  (3)忽视这一信号。

  trap对上面3种方式提供了3种基本形式:

  第一种形式的trap命令在Shell接收到与signal list清单中数值相同的信号时,将执行双引号中的命令串。

  trap ' commands'  signal-list

  trap " commands"  signal-list

  为了恢复信号的默认操作,使用第二种形式的trap命令:

  trap signal-list

  第三种形式的trap命令允许忽略信号:

  trap "  "  signal-list

  注意:

  (1)对信号11(段违例)不能捕捉,因为Shell本身需要捕捉该信号去进行内存的转储。

  (2)在trap中可以定义对信号0的处理(实际上没有这个信号),Shell程序在其终止(如执行exit语句)时发出该信号。

  (3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将Shell程序终止的话,Shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致Shell程序无法终止。

   另外,在trap语句中,单引号和双引号是不同的。当Shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若 commands是用单引号括起来的话,那么Shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体 的值来替换。 
(http://www.fanqiang.com)
分享到:
评论

相关推荐

    Shell程序设计的流程控制

    和其他高级程序设计语言一样,Shell提供了用来控制程序执行流程的命令,包括条件分支和循环结构,用户可以用这些命令创建非常复杂的程序。与传统语言不同的是,Shell用于...本文将为大家介绍Shell程序设计的流程控制。

    Linux shell编程

    linux shell简介 shell程序设计基础 shell程序设计流程控制 shell函数

    Linux shell 编程

    •第一部分:Linux Shell 简介 •第二部分:Shell 程序设计基础 •第三部分:Shell 程序设计流程控制 •第四部分:Shell函数

    UNIX shell 编程指南

    Shell程序设计的流程控制 身份证升位shell版(15位到18位) bash的内部命令 shell技术要点 unix下快速切换目录的shell linux shell 变量和运算符 执行Shell脚本的方式 [小函数]:bash版rev&tac shell编程走马观花系列...

    实战Linux Shell编程与服务器管理-作者:卧龙小三(1)

    要达到这个境界,管理者必须具备相当程度的Shell操控能力与Shell程序设计能力,笔者拥有丰富的主机管理实务经验,以及多年的教学经验,能引领读者轻松跨越Bash Shell程序设计的门槛,摆脱菜鸟劳碌的命运,达到轻松...

    LinuxShell编程全攻略

    介绍shell编程的相关知识 Shell 基本语法 Shell 定义的环境变量 用户定义的变量 Shell 程序设计的流程控制 运行Shell 程序的方法 bash 的内部命令

    实战Linux Shell编程与服务器管理-作者:卧龙小三(7)

    要达到这个境界,管理者必须具备相当程度的Shell操控能力与Shell程序设计能力,笔者拥有丰富的主机管理实务经验,以及多年的教学经验,能引领读者轻松跨越Bash Shell程序设计的门槛,摆脱菜鸟劳碌的命运,达到轻松...

    Linux的Shell编程

    Linux的Shell编程:Shell基本语法,Shell程序设计的流程控制,运行Shell程序的方法

    Shell脚本编程基础篇思维导图

    SHELL是UNIX系统的用户...这个命令程序称为SHELL程序或SHELL过程。在Shell编程基础篇详细介绍了环境和变量、字符串处理、数组、注释、参数传递、基本运算符、选择循环的流程控制、函数、输入/输出重定向、文件格式等。

    嵌入式Linux程序设计案例与实验教程(配套光盘)第一部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第二部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

    linux程序设计(第三版)

    包括程序设计、数据结构、操作系统和软件工程,但并未找到一本适合于当前使用的、系统描述LINUX和UNIX编程工具和实用程序(用于编译多模块程序、调试、处理库、软件剖析和版本控制)的教材,于是决定编写本书。...

    嵌入式Linux程序设计案例与实验教程-实例代码

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建...

    嵌入式Linux程序设计案例与实验教程(配套光盘)第三部分

    1.4.1 Shell程序的编写和执行8 1.4.2 Shell的变量8 1.4.3 Shell的测试命令9 1.4.4 条件语句9 1.4.5 循环语句9 1.4.6 函数10 实验1.3 Shell脚本编程实验10 .第2章 嵌入式Linux系统基础12 2.1 构建嵌入式...

Global site tag (gtag.js) - Google Analytics