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. 72. Edit Distance(困难,确实挺难的,但很经典,双序列DP问题)

    Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...

  2. nginx模块,模块的配置使用

    nginx模块官方模块(默认支持的)第三方模块 1. --with-http_stub_status_module nginx的客户端状态 配置syntax: sub_status;default:- ...

  3. CI下载与安装_基础配置_MVC

    CI:CodeIgniter -- 由Ellislab公司的CEORickEllis开发,是一个简单快速的PHP MVC框架. =============下载和安装================地址 ...

  4. js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面

    js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面 , 做手机端开发时,发现一个问题,有些浏览器,在网速比较慢的情况下,js文件没有加载完,后续的调用已经开始调用了, ...

  5. ACM Ignatius and the Princess I

    公主被BEelzebub feng5166绑架,我们的英雄Ignatius必须拯救我们美丽的公主. 现在他进入feng5166的城堡.城堡是一个大迷宫.为简单起见,( To make the prob ...

  6. MongoDB 自动增长

    MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识. 但在某些情况下,我们可能需要实现 ObjectId 自动增长功能. 由于 Mon ...

  7. PTA中提交Python3程序的一些套路

    0. FAQ 0.1 提交后提示"答案错误"或者"格式错误" PTA检查答案正确与否是通过字符串匹配实现的.所以可能有以下几种原因: 格式错误:程序的输出要与题 ...

  8. 制定一个apk路径 然后跳出安装界面

    制定一个apk的路径 然后跳出界面让用户选择是否安装 我们系统有一个写好的Activity来协助我们完成这一功能 我们来看看它的清单文件 <?xml version="1.0" ...

  9. 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比

    总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到 ...

  10. 优先使用TimeUnit类中的sleep()

    TimeUnit是什么? TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段 ...