linux shell编程语句if、case.
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.的更多相关文章
- linux —— shell 编程(编程语法)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 再识变量 函数 条件语句 循环语句 ...
- linux shell编程总结
linux shell编程总结 本周学习了unix/linux shell编程,参考的是<LINUX与UNIX Shell 编程指南>,David Tansley著:徐焱,张春萌等译,由机 ...
- linux shell 编程参考
#!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(m ...
- Linux Shell编程与编辑器使用详解
<Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
- Linux Shell编程参考大全
本文记录Linux Shell编程中常用基本知识,方便快速入门以及查询使用. 本文主要分为以下几个部分: 一.Shell中的变量 任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识. ...
- 一文学完Linux Shell编程,比书都好懂
一. Shell 编程 1. 简介 Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务. Shell 既是一种命令语言,又是一种程序设计语言. Shell scr ...
- 前端学习 linux —— shell 编程
前端学习 linux - shell 编程 shell 原意是"外壳",与 kernel(内核)相对应,比喻内核外的一层,是用户和内核沟通的桥梁.shell 有很多种,国内通常使用 ...
- Linux Shell编程中的几个特殊符号命令 & 、&& 、 ||
https://blog.csdn.net/hack8/article/details/39672145 Linux Shell编程中的几个特殊符号命令 & .&& . || ...
随机推荐
- 吴恩达深度学习第2课第2周编程作业 的坑(Optimization Methods)
我python2.7, 做吴恩达深度学习第2课第2周编程作业 Optimization Methods 时有2个坑: 第一坑 需将辅助文件 opt_utils.py 的 nitialize_param ...
- c++ 深入理解数组
阅读前提:你得知道啥是数组. 本文需要弄清楚的问题如下: 1,数组作为函数参数,传入的是值,还是地址? 2,数组作为函数参数,数组的长度能否确定? 解决如下 1,数组作为函数参数,传入的是地址.因为数 ...
- c++ 深入理解虚函数
为什么使用虚函数?什么是虚函数?虚函数是为了解决什么问题? 面向对象的三大特征: 封装 多态 继承 普通虚函数 虚析构函数 纯虚函数 抽象类 接口类 隐藏 vs 覆盖 隐藏与覆盖之间的关系 早绑定和晚 ...
- Template Method 模板设计模式
什么是模板设计模式 对于不了解的模板设计模式的来说,可以认为如同古代的造纸术一样,纸所以成型,取决于用了模板的形状,形状又由镂空的木板组成,而你想要造什么纸,又取决于你使用什么材料. 上面提到了两个关 ...
- Docker内核能力机制
能力机制(Capability)是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制. Linux 内核自 2.2 版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进 ...
- Android开发学习之路--性能优化之常用工具
android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...
- C/C++静态数组与动态数组的区别
简介 以下三行代码有什么区别? int a[10]; int *a = (int*)malloc(sizeof(int)*10); int *a = new int[10]; 第一行代码定义a为包含1 ...
- NLP系列(2)_用朴素贝叶斯进行文本分类(上)
作者:龙心尘 && 寒小阳 时间:2016年1月. 出处: http://blog.csdn.net/longxinchen_ml/article/details/50597149 h ...
- 异步请求引发的Chrome死锁
浏览器支持的并发异步请求数目是有限的,当需要的资源过多时候(远远大于并发数目),就需要自己管理XHR请求. 在实现自己的XHR的Manger时候,当请求数目达到2000多的时候,经常会遇到chrome ...
- Android开发学习之路--逆向分析反编译
一般情况下我们想要了解别人的app怎么实现这个动画,这个效果的时候,总是会想到反编译一下,看下布局,看下代码实现.对,这对于有经验的玩家确实手到擒来了,但是初学者,根本就不知道怎么反编译,怎么看代 ...