1使用if-then语句

f-then语句有如下格式。

if command
then
commands
fi

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

举例:

$ vim test1.sh
#!/bin/bash
# testing the if statement
if pwd
then
echo "It worked"
fi

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

此外,还有一种写法:

if command; then
commands
fi

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

2 if-then-else语句

格式:

if command
then
commands
else
commands
fi

3 嵌套if

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

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

$ ls -d /home/NoSuchUser/
/home/NoSuchUser/
$
$ vim test5.sh
#!/bin/bash
# Testing nested ifs
testuser=NoSuchUser
if grep $testuser /etc/passwd
then
echo "The user $testuser exists on this system."
else
echo "The user $testuser does not exist on this system."
if ls -d /home/$testuser/
then
echo "However, $testuser has a directory."
fi
fi

4 test命令

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

test命令的格式非常简单:

test condition

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

if test condition
then
commands
fi

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

$ vim test6.sh
#!/bin/bash
# Testing the test command
if test
then
echo "No expression returns a True"
else
echo "No expression returns a False"
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

举例:

$ vim numeric_test.sh
#!/bin/bash
# Using numeric test evaluations
value1=10
value2=11
if [ $value1 -gt 5 ]
then
echo "The test value $value1 is greater than 5"
fi
if [ $value1 -eq $value2 ]
then
echo "The values are equal"
else
echo "The values are different"
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布尔运算符的使用。

$ vim test22.sh
#!/bin/bash
if [ -d $HOME ] && [ -w $HOME/testing ]
then
echo "The file exists and you can write to it"
else
echo "I cannot write to the file"
fi 结果:
$ ./test22.sh
I cannot write to the file
$
$ touch $HOME/testing
$
$ ./test22.sh
The file exists and you can write to it

6 if-then的高级特性

6.1使用双括号

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

符  号

描  述

val++

后增

val--

后减

++val

先增

--val

先减

!

逻辑求反

~

位求反

**

幂运算

<<

左位移

>>

右位移

&

位布尔和

|

位布尔或

&&

逻辑和

||

逻辑或

6.2使用双方括号

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

[[ expression ]]

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

7case命令

格式:

case variable in
pattern1 | pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
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. react 阻止事件传递/冒泡

    当我们设计界面时,在以下情况会需要阻止元素/组件内的事件阻断,不被上层触发: 弹出提示框,期望点击框外空白区域可以关闭弹框.点击框内不关闭弹框 组件设计时,期望点击全局/点击指定元素时,显示不一样的交 ...

  2. Python 实现分层聚类算法

    ''' 1.将所有样本都看作各自一类 2.定义类间距离计算公式 3.选择距离最小的一堆元素合并成一个新的类 4.重新计算各类之间的距离并重复上面的步骤 5.直到所有的原始元素划分成指定数量的类 程序要 ...

  3. PHP fstat() 函数

    定义和用法 fstat() 函数返回关于一个打开的文件的信息. 该函数将返回一个包含下列元素的数组: [0] 或 [dev] - 设备编号 [1] 或 [ino] - inode 编号 [2] 或 [ ...

  4. PHP expm1() 函数

    实例 返回 exp() - 1: <?phpecho(expm1(0) . "<br>");echo(expm1(1) . "<br>&qu ...

  5. PHP substr_count() 函数

    实例 计算 "world" 在字符串中出现的次数: <?php高佣联盟 www.cgewang.comecho substr_count("Hello world. ...

  6. C++程序员容易走入性能优化误区!对此你怎么看呢?

    有些C++ 程序员,特别是只写C++ 没有写过 Python/PHP 等慢语言的程序员,容易对性能有心智负担,就像着了魔一样,每写3 行代码必有一行代码因为性能考虑而优化使得代码变形(复杂而晦涩). ...

  7. SpringBoot集成Elasticsearch7.6

    前言: 本文不赘述Elasticsearch的相关基础知识点和部署,只介绍如何在SpringBoot如何集成Elasticsearch并进行数据操作 Spring Data项目中提供了操作es的框架S ...

  8. Linux之iptables原理详解

    目录: 一.netfilter与iptables 二.filter.nat.mangle等规则表 三.INPUT.FORWARD等规则链和规则 四.Linux数据包路由原理 五.iptables编写规 ...

  9. JVM系列之:JIT中的Virtual Call

    目录 简介 Virtual Call和它的本质 Virtual Call和classic call Virtual Call优化单实现方法的例子 Virtual Call优化多实现方法的例子 总结 简 ...

  10. Improving RGB-D SLAM in dynamic environments: A motion removal approach

    一.贡献 (1)提出一种针对RGB-D的新的运动分割算法 (2)运动分割采用矢量量化深度图像 (3)数据集测试,并建立RGB-D SLAM系统 二.Related work [1]R.K. Namde ...