shell学习笔记--if,case

shell的控制流结构主要有if语句、for语句、case语句、while语句、until语句这五种,在shell中这些语句的用法有点类似C语言,很容易学会,但也很容易忘记,只有经常实用它们才不会很快忘记,像我之前看的时候很快就看完了,但是很久没用,过一阵子又把它忘记了,现在又重看了一遍才记起来,好了,下面将详细介绍这几种语句的用法:

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了,这些都是你根据需要去使用的。当然了,如果你有很多个条件,你也可以使用多个elif,就像C语言一样。

举个例子:

$cat iftest

#!/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”]这样是错误的写法,一定要在两边各留一个空格才是测试命令。这里可以看出,if后面跟着的是一条命令,if这里明明要跟一个条件才对啊,为什么会跟一条命令呢?这是因为在shell中,所有的命令执行后都有一个返回值,if是接收到该返回值作为它的条件,也就是真还是假这两种条件,如果该命令执行成功,则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语句如果没有;;就会报错,但是C中的case语句少了break,语法上还是正确的,只是在符合该模式后还会继续执行直到遇到break或直到结束为止。在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...这种格式的。

linux shell编程语句if、case.的更多相关文章

  1. linux —— shell 编程(编程语法)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...

  2. linux shell编程总结

    linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...

  3. linux shell 编程参考

    #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...

  4. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  5. linux —— shell 编程(文本处理)

    导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...

  6. Linux Shell编程参考大全

    本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...

  7. 一文学完Linux Shell编程,比书都好懂

    一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...

  8. 前端学习 linux —— shell 编程

    前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...

  9. Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||

    https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...

随机推荐

  1. Swift基础之CoreData的使用

    以前使用过OC版本的CoreData应该很好理解Swift方式,所以这里简单的展示一下,增删改查的方法使用,同时给大家说一下创建步骤,方便大家的使用,转载请注明出处,谢谢~ 步骤一:创建一个Swift ...

  2. Web Worker Best Practices

    使用Web Worker可以把一些比较计算量相对大的阻塞浏览器响应的计算放在单独的线程里计算. 请求优化 构造Worker的时候需要给定js的链接URL,worker内部请求js运行代码.假如work ...

  3. Android5.0特性ToolBar

    >Toolbar是什么?大概说一下它的官方介绍.Toolbar是应用的内容的标准工具栏,`可以说是Actionbar的升级版`,两者不是独立关系,要使用Toolbar还是得跟ActionBar扯 ...

  4. ECharts, PHP, MySQL, Ajax, JQuery 实现前后端数据可视化

    ECharts 下载js代码 工作原理浅析 在项目中引入ECharts 后台处理 数据库端MySQL PHP端 JQuery Ajax处理 ECharts 端处理 前端全部代码 演示结果 总结 最近要 ...

  5. 一个整数数组,有n个整数,如何找其中m个数的和等于另外n-m个数的和?

    int getSum(int* arr, int len) { int sum = 0; for (int i = 0; i < len; ++i) { sum += arr[i]; } ret ...

  6. Struts 2 之文件上传

    如果要获得上传文件的原始名称,需要定义一个String类型的属性,属性名必须为***FileName,其中***为File属性的名称:同理,如果要获取该文件的MIME类型,需要定义一个***Conte ...

  7. 【移动开发】binder阻塞/非阻塞与单向/双向的问题

    The client thread calling transact is blocked by default until onTransact has finishedexecuting on t ...

  8. linux中查看现在使用的shell是ksh还是bash?以及怎样修改?

    查看系统支持的shell: cat  /etc/shells 查看现在使用的shell:  修改默认shell: 另外,修改了系统默认shell之后不会立即生效,之后再次登录系统修改的shell才会生 ...

  9. expect 简单使用

    简单的登陆脚本 这样就不用每次都输入ssh命令了,使用密码还是有些不安全,谨慎使用. #!/usr/bin/expect -f #filename: auto_login.sh #author: or ...

  10. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...