shell流控制:http://www.cnblogs.com/yunjiaofeifei/archive/2012/06/12/2546208.html

1、if then else
语句

if then else语句的基本格式如下:

if 条件1

then 命令1

elif 条件2

then 命令2

else 命令3

fi

if语句以if开头,而以fi结束,在shell中的控制流结构的分支语句都是像这样开头跟结束的语句相反反过来,如下面的case语句,以case开头,以esac结束。elif即C语言的else
if的意思。如果你只有一个条件,就没必要用到elif、else了。

一个例子:

#!/bin/sh

#iftest

if [ “10” -lt “12” ]

then

echo “yes,10 is less than 12”

fi

执行一下iftest

$./iftest

yes,10 is less than 12

其中,[]是测试命令,测试里面的内容是真还是假,如果真,则该测试命令返回的结果是真,如果为假则返回假。注意:[]与中间的内容一定要在两边各留一个空格,否则会出错。如[“10” -lt “12”]这样是错误的写法,一定要在两边各留一个空格才是测试命令。

因为在shell中,所有的命令执行后都有一个返回值,if是接收到该返回值作为它的条件。平时执行ls、cp、touch、mkdir等等这些命令时系统都会返回一个值表示执行该命令是否成功,该返回值就保存在$?这里了,如果你要看它的值就可以用:echo
$?来查看了。如:

$ls

a.txt b.doc

$echo $?

0

在linux中一般用0表示执行成功,而非0则表示失败。如:

if ls

then

echo “Yes”

else

echo “no”

fi

该程序执行后的结果将会打印出Yes。这里ls执行成功后返回的值为0(成功),if接收到成功信号则其条件为真,所以就打印出Yes了。这里不要跟C的if混淆了,在C中0为假,非0为真,而这里倒反过来了,0为真,非0则为假了。这个就涉及到linux的习惯了,因为linux习惯用0来表示成功,非0表示失败。这里还要小心,不能像这样用:if
(“10” -lt“12”)。上面的[“10”
-lt “12” ]也是一个命令来的,相当于命令:test“10” -lt
“12”。test是一个测试命令,如果要讲测试命令还有很多要讲,这里就直接讲控制流结构,至于测试命令有空再写了。

2、case 语句

case语句的格式如下:

case 值 in

模式1)

命令1

...

;;

模式2)

命令2

...

;;

......

esac

上面的;;有点相当于C中case中的break语句的意味了,即执行完该模式后跳出case语句,不过有点不同的就是,shell中的case语句如果没有;;就会报错。

shell的case语句可以使用匹配模式,是元字符匹配模式,而不是正则表达式的匹配:

* 匹配所有的字符

? 匹配单个字符

[...]匹配[]括起的字符

所以在C中使用default模式的,这里可以使用*来代替如:

$cat casetest

#!/bin/sh

#casetest

echo "please input number 1 to 3"

read number

case $number in

1)

echo "you input 1"

;;

2)

echo "you input 2"

;;

3)

echo "you input 3"

;;

*)

echo "error! the number you input isn't 1 to 3"

;;

esac

执行这个shell脚本,如果你输入的是1~3外的数字,都将输出error! the number you input isn't 1 to 3这句。这里的*就是匹配所有模式。从前面开始执行,如果它不匹配于前面的任何一种模式,则会匹配到这里的*,结果就自然输出error! the number you input isn't 1 to 3这句了。case语句中的模式中还可以使用|(或),如:

$cat casetest

#!/bin/sh

#casetest

echo "please input number 1 to 10"

read number

case $number in

1|2|3)

echo "the number you input is 1~3"

;;

4|5|6)

echo "the number you input is 4~6"

;;

7|8|9|10)

echo "the number you input is 7~10"

;;

*)

echo "error! the number you input isn't 1 to 10"

;;

esac

这样无论你输出的是1,还是2,还是3都会输出第一句话,无论你输出的是4,还是5,还是6输出的都是第二句话,如此类推。最后来一个经典的例子:

$cat caseparam

#!/bin/sh

#caseparam

if [ $# != 1 ]

then

echo "Usage:`basename $0` [start|stop|help]" >&2

exit 1

fi

OPT=$1

case $OPT in

start)

echo "start..`basename $0`"

;;

stop)

echo "stop..`basename $0`"

;;

help)

echo "now don't support help"

;;

*)

echo "Usage:`basename $0` [start|stop|help]"

;;

esac

执行这个程序如果用./caseparam则输出:Usage:caseparam [start|stop|help] ;如果用./caseparam start 则输出:start..caseparam;如果用./caseparam stop则输出:stop..caseparam等等,以此类推。上面的$#是计算参数的个数,所以如果参数个数不等于1的话,该程序则退出。这个程序是不是感觉好熟悉呢?一般在/etc/init.d/下面的程序都是这种start、stop、restart...这种格式的。

shell的case语句简述(shell的流控制)的更多相关文章

  1. (二)shell中case语句、程序传参、while

    2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中 ...

  2. Shell 编程 case语句

    本篇主要写一些shell脚本case语句的使用. 字符判断 #!/bin/bash read -p "请输入一个字符:" char case $char in [a-z]|[A-Z ...

  3. linux bash shell中case语句的实例

    本文介绍下,在bash shell编程中,有关case语句的一个例子,学习下case语句的用法,有需要的朋友参考下. 本文转自:http://www.jbxue.com/article/13377.h ...

  4. shell的case语句

    case语句格式 # vi test.sh : echo "input : " read num echo "the input data is $num" c ...

  5. Shell脚本case语句

    case语句格式 case 变量 in PAT1) 执行语句 ;; PAT2) 执行语句 ;; *) 默认执行语句 ;; esac 使用示例: 编写一个shell脚本,通过提示用户输入信息,输出cpu ...

  6. Linux Shell编程case语句

    http://blog.csdn.net/dreamtdp/article/details/8048720 case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下: case $变 ...

  7. 【shell】case语句

    case只能判断一种条件关系,而if能判断多种条件关系 #!/bin/bash read -p "please input your choice (high/middle/low):&qu ...

  8. shell编程:case语句

  9. SHELL用法五(Case语句)

    1.SHELL编程Case语句案例实战 1)Case选择条件语句的格式: case $INPUT in Pattern1) 语句1 ;; Pattern2) 语句2 ;; esac 2)Case语句企 ...

随机推荐

  1. c#默认类的修饰符。

    类的默认修饰符是internal  当其修饰符为internal时,其他模块不能访问该类, 所以class类的修饰符一般为public

  2. Sprk SQL

    一.Spark SQL概述  1.Spark SQL的前生今世 Shark是一个为Spark设计的大规模数据仓库系统,它与Hive兼容.Shark建立在Hive的代码基础上,并通过将Hive的部分物理 ...

  3. ABP文档笔记 - 事件BUS

    文档: ABP框架 - 领域事件(EventBus) EventBus & Domain Events ABP源码分析二十五:EventBus EventBus(事件总线) EventBus是 ...

  4. ES6(类)

    类的概念 1.基本定义 2.继承 继承如何传递参数?(super) 定义自己属性的时候调用 this 一定要在 super 之后(在继承关系中,子类的构造函数如果用 super 传递参数的过程中,su ...

  5. Java程序员的现代RPC指南

    Java程序员的现代RPC指南 1.前言 1.1 RPC框架简介 最早接触RPC还是初学Java时,直接用Socket API传东西好麻烦.于是发现了JDK直接支持的RMI,然后就用得不亦乐乎,各种大 ...

  6. YAML 在Python中的配置应用

    环境搭建 YAML语法 语法规则 数据结构 列表数组 原子量 YAML应用 案例 load dump 总结 YAML是一个堪比XML,JSON数据格式的更加方便,简洁的,易于人眼阅读的序列化数据格式. ...

  7. 安卓热修复之AndFIX

    我致力于最新的前沿安卓技术分析和使用教学,不打算将很多很深的东西,因为有多少人愿意沉下你的心境去学习难点?我一般只会简单提及.文字错漏在所难免还希望同学们喜欢 热修复介绍 热修复是什么? 如果你一个项 ...

  8. Swift:消除Null值

    由于在现代编程语言中这个无所不在的概念,许多程序猿可能倾向于相信null值是一个必须存在的瑕疵,创建一个没有它的编程语言是不可能的.他们可能会惊奇那些许多没有null值活的也很好的语言,这带来的结果就 ...

  9. Android Lollipop 5.0 经典新特性回顾

    *Tamic 专注移动开发! 更多文章请关注 http://blog.csdn.net/sk719887916 虽然Android已到了7.0 ,但是我们还是不能忘怀视觉革命性改变的5.0,今天回顾下 ...

  10. ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

    ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中 ...