1使用if-then语句

f-then语句有如下格式。

  1. if command
  2. then
  3. commands
  4. fi

bash shell的if语句会运行if后面的那个命令。如果该命令的退出状态码是0(该命令成功运行),位于then部分的命令就会被执行。如果该命令的退出状态码是其他值, then部分的命令就不会被执行,bash shell会继续执行脚本中的下一个命令。fi语句用来表示if-then 语句到此结束。

举例:

  1. $ vim test1.sh
  2. #!/bin/bash
  3. # testing the if statement
  4. if pwd
  5. then
  6. echo "It worked"
  7. fi

命令行运行该脚本时,会得到如下结果:

此外,还有一种写法:

  1. if command; then
  2. commands
  3. fi

通过把分号放在待求值的命令尾部,就可以将then语句放在同一行上了。

if-then-else语句

格式:

  1. if command
  2. then
  3. commands
  4. else
  5. commands
  6. fi

3 嵌套if

有时需要检查脚本代码中的多种条件。对此,可以使用嵌套的if-then语句。

比如要检查/etc/passwd文件中是否存在某个用户名以及该用户的目录是否尚在,可以使用嵌套的if-then语句。嵌套的if-then语句位于主if-then-else语句的else代码块中。

  1. $ ls -d /home/NoSuchUser/
  2. /home/NoSuchUser/
  3. $
  4. $ vim test5.sh
  5. #!/bin/bash
  6. # Testing nested ifs
  7. testuser=NoSuchUser
  8. if grep $testuser /etc/passwd
  9. then
  10. echo "The user $testuser exists on this system."
  11. else
  12. echo "The user $testuser does not exist on this system."
  13. if ls -d /home/$testuser/
  14. then
  15. echo "However, $testuser has a directory."
  16. fi
  17. fi

test命令

test命令提供了在if-then语句中测试不同条件的途径。如果test命令中列出的条件成立, test命令就会退出并返回退出状态码0。如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-then语句不会再被执行。

test命令的格式非常简单:

  1. test condition

当用在if-then语句中时,test命令看起来是这样的:

  1. if test condition
  2. then
  3. commands
  4. fi

如果不写test命令的condition部分,它会以非零的退出状态码退出,并执行else语句块:

  1. $ vim test6.sh
  2. #!/bin/bash
  3. # Testing the test command
  4. if test
  5. then
  6. echo "No expression returns a True"
  7. else
  8. echo "No expression returns a False"
  9. fi

执行结果:

4.1数值比较

比  较

描  述

n1 -eq n2

检查n1是否与n2相等

n1 -ge n2

检查n1是否大于或等于n2

n1 -gt n2

检查n1是否大于n2

n1 -le n2

检查n1是否小于或等于n2

n1 -lt n2

检查n1是否小于n2

n1 -ne n2

检查n1是否不等于n2

举例:

  1. $ vim numeric_test.sh
  2. #!/bin/bash
  3. # Using numeric test evaluations
  4. value1=10
  5. value2=11
  6. if [ $value1 -gt 5 ]
  7. then
  8. echo "The test value $value1 is greater than 5"
  9. fi
  10. if [ $value1 -eq $value2 ]
  11. then
  12. echo "The values are equal"
  13. else
  14. echo "The values are different"
  15. fi

第一个条件测试:

if [ $value1 -gt 5 ] : 测试变量value1的值是否大于5。

第二个条件测试:

if [ $value1 -eq $value2 ] : 测试变量value1的值是否和变量value2的值相等

结果:

4.2字符串比较

比  较

描  述

str1 = str2

检查str1是否和str2相同,会将所有的标点和大小写情况都考虑在内

str1 != str2

检查str1是否和str2不同,会将所有的标点和大小写情况都考虑在内

str1 < str2

检查str1是否比str2小

str1 > str2

检查str1是否比str2大

-n str1

检查str1的长度是否非0

-z str1

检查str1的长度是否为0

关于字符串顺序 :

当要开始使用测试条件的大于或小于功能时,就会出现两个问题:

  • 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名;
  • 大于和小于顺序和sort命令所采用的不同。

4.3文件比较

比  较

描  述

-d file

检查file是否存在并是一个目录

-e file

检查file是否存在

-f file

检查file是否存在并是一个文件

-r file

检查file是否存在并可读

-s file

检查file是否存在并非空

-w file

检查file是否存在并可写

-x file

检查file是否存在并可执行

-O file

检查file是否存在并属当前用户所有

-G file

检查file是否存在并且默认组与当前用户相同,只比较默认组,不会比较其他组

file1 -nt file2

检查file1是否比file2新

file1 -ot file2

检查file1是否比file2旧

5复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:

  • [ condition1 ] && [ condition2 ] :要让then部分的命令执行,两个条件都必须满足。
  • [ condition1 ] || [ condition2 ] :如果任意条件为TRUE,then部分的命令就会执行。

下例展示了AND布尔运算符的使用。

  1. $ vim test22.sh
  2. #!/bin/bash
  3. if [ -d $HOME ] && [ -w $HOME/testing ]
  4. then
  5. echo "The file exists and you can write to it"
  6. else
  7. echo "I cannot write to the file"
  8. fi
  9.  
  10. 结果:
  11. $ ./test22.sh
  12. I cannot write to the file
  13. $
  14. $ touch $HOME/testing
  15. $
  16. $ ./test22.sh
  17. The file exists and you can write to it

if-then的高级特性

6.1使用双括号

双括号命令允许你在比较过程中使用高级数学表达式,见下表:

符  号

描  述

val++

后增

val--

后减

++val

先增

--val

先减

!

逻辑求反

~

位求反

**

幂运算

<<

左位移

>>

右位移

&

位布尔和

|

位布尔或

&&

逻辑和

||

逻辑或

6.2使用双方括号

双方括号命令提供了针对字符串比较的高级特性。双方括号命令的格式如下:

  1. [[ expression ]]

它提供了test命令未提供的另一个特性——模式匹配(就是支持正则表达式)。

7case命令

格式:

  1. case variable in
  2. pattern1 | pattern2) commands1;;
  3. pattern3) commands2;;
  4. *) default commands;;
  5. esac

Shell编程—结构化命令的更多相关文章

  1. Shell编程—结构化命令(2)

    1for命令 for命令的基本格式: for var in list do commands done 在list参数中,你需要提供迭代中要用到的一系列值. 1.1读取列表中的值 例子: $ vim ...

  2. Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)

    一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...

  3. Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较)

    一.概述 接着上篇讲的结构化命令,最后讲到了test命令的另一种写法 if [ condition ],它的语法格式如下: --格式如下: if [ condition ] then commands ...

  4. shell的结构化命令

    shell在逻辑流程控制这里会根据设置的变量值的条件或其他命令的结果跳过一些命令或者循环执行的这些命令.这些命令通常称为结构化命令 1.if-then语句介绍 基本格式 if command then ...

  5. Linux&shell之结构化命令进阶

    写在前面:案例.常用.归类.解释说明.(By Jim) for命令重复一系列的命令是一种常见的编程实践. #!/bin/bash # basic for command for test in A B ...

  6. Linux&shell之结构化命令

    写在前面:案例.常用.归类.解释说明.(By Jim)使用if-then语句如果命令的退出状态是0(成功执行命令),将执行then后面的所有命令.如果命令的退出状态是0以外的其他值,那么then后面的 ...

  7. shell初级-----结构化命令

    if-then语句 bash shell的if语句会执行if后面的那个命令,如果该命令的退出码状态为0会执行then部分的命令,如果是其他值不会执行. 格式如下: if command then co ...

  8. 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令

    许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then     ...

  9. Shell 语法之结构化命令(流程控制)

    许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...

随机推荐

  1. Python long() 函数

    描述 long() 函数将数字或字符串转换为一个长整型.高佣联盟 www.cgewang.com 语法 long() 函数语法: class long(x, base=10) 参数 x -- 字符串或 ...

  2. Python 字典(Dictionary) clear()方法

    Python 字典(Dictionary) clear()方法 描述 Python 字典(Dictionary) clear() 函数用于删除字典内所有元素.高佣联盟 www.cgewang.com ...

  3. 6.15 省选模拟赛 老魔杖 博弈论 SG函数

    这道题确实没有一个很好的解决办法 唯一的正解可能就是打表找规律 或者 直接猜结论了吧. 尽管如此 在此也给最终结论一个完整的证明. 对于70分 容易发现状态数量不大 可以进行暴力dp求SG函数. 原本 ...

  4. 什么是Cookie、Session、Token?

    原文:https://mp.weixin.qq.com/s/pWXhI_ppKhtOP-Xf_SpuDA 来源:后厂村码农 在了解这三个概念之前我们先要了解 HTTP 是无状态的Web服务器,什么是无 ...

  5. three.js 着色器材质基础(一)

    说起three.js,着色器材质总是绕不过的话题,今天郭先生就说一说什么是着色器材质.着色器材质是很需要灵感和数学知识的,可以用简短的代码和绘制出十分丰富的图像,可以说着色器材质是脱离three.js ...

  6. 【CF600E】Lomset gelral 题解(树上启发式合并)

    题目链接 题目大意:给出一颗含有$n$个结点的树,每个节点有一个颜色.求树中每个子树最多的颜色的编号和. ------------------------- 树上启发式合并(dsu on tree). ...

  7. Java课堂总结

    通过重载函数,来实现对不同类型的参数运算.

  8. Python解决网吧收费系统,远控网吧电脑设备!

    python破解网吧收费系统,远控网吧电脑设备! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更 ...

  9. windows 下部署 .netcore 到 windows service

    接上一篇 <windows 下部署 .netcore 到 iis>,这一篇记录一下怎么将 Asp.Net Core 以 windows 服务的方式部署. 一.修改代码 其实也很简单,只要调 ...

  10. JS pc端网页特效

    offset     offset翻译就是偏移量,可以使用他相关的属性可以动态的得到该元素的位置.大小等等     获得元素距离带有定位父元素的位置     获得元素自己的大小(宽度高度)     注 ...