在bash脚本中我们常用的一种条件判断语句是if语句。if语句的语法为

单分支if语句

if  条件判断

then

   语句1

   语句2

   ......

else

   语句1

   语句2

   ......

if

所以条件判断成为if语句的核心。下面我们来了解一下条件判断的相关内容。


一、bash中条件测试的几种方式:

1、[ expression ]:方括号中的字符最好都用空格分隔,“=”“==”两边一定要有空格。

2、[ [expression] ]:用于通配符匹配“==”和正则表达式匹配“=~”

3、test expression:

4、独立执行的命令:

101138650.png

可以看出[]和test都是shell的内建命令,而"[[]]"则是shell的关键字

因为[]和test是命令所以当他们做逻辑与的时候要用-a选项,做逻辑或的时候要用-o选项

[[]]:做逻辑与的时候要用&&,做逻辑或的时候要用到||。


二、条件真假判断

在bash中命令被正确执行后会返回0,如果没有被正确执行将返回1-255之间的值。例如在单分支的if语句中如果返回的值为0,那么将执行then后面的语句。如果条件不满足则执行else后面的语句。

   命令回传值通过#echo $?来查看。

   因为if语句一般都是在脚本中使用,为了更好的演示条件测试,我会的演示会是在命令提示符下。而在命令提示符下可以通过&&和||来做条件测试。我们来了解一下&&,||的使用。

   大家都知道在命令提示符下我们可以同时输入多条命令中间用;间隔。例如:

151818182.png

使用;命令会被顺序执行,而&&和||就厉害了,这两个符号会根据第一个命令执行结果来判断后面的命令是否要被执行。

&&:Command1 && Commamd2    

       若Command1运行完成且正确运行,即$?=0。那么开始运行Command2。

       若Command1运行完成但为错误,即$?返回为非零,那么Command2将不会被执行。

       可以把Command1和Command2理解为串联电路上的两个开关。当Command1闭合    (即正确运行返回$?=0),那么就要判断Command2是否闭合,这样才能判断是否形成回路

       相反,如果Command1不是闭合状态,那么判断Command2就没有意义了,所以程序就终止了。

||:Command1||Command2

       ||在做判断的时候和&&相反。

       若Command1运行完成但为错误,即$?返回为非零,那么开始运行Command2。

       若Command1运行完成且结果正确,即$?=0。那么Command2将不会被执行。

       可以把||理解为并联电路。即一旦Command1闭合($?=0)那么形成回路,不需要再对Command2做判断,只有当Command1是开启时($?非零)才执行Command1

下面用两个例子来说明&&和||的使用结果。

154636695.png

因为/root/test被正确创建,所以执行了拷贝命令。下面我们删除/root/test目录,在root的test目录下创建一个dir1的目录(不使用递归参数),那么当这个命令不能被正确执行的时,我们来看下后面命令是否会被执行。  

155138416.png

你会看到第一个命令出错,后面的命令被忽略了。那么同样的命令我们将&&替换为||后面的命令会被执行吗?

需要注意的是&&和||是可以连用的。即

Command1 && Command2 || Command3。

例如我们想要在/tmp目录下创建一个test目录,并且将/etc/passwd文件拷贝到/tmp/test中去。而我们事先并不确定/tmp下有没有test这个目录,那么我们该怎么做了。

160247382.png

怎么样?文件拷贝成功了吧!尽管有一个关于ls的错误提示。


三、在bash中条件测试分为整数测试,字符串测试,文件测试三大块。

1、整数测试。

bash对算数运算的处理能力不强,并且只能对整数做算术运算。整数测试的操作符。

大于:-gt

大于等于:-ge

小于:-lt

小于等于:-le

等于:-eq

不等于:-ne

163459602.png

2、字符测试。

\>:大于

\<:小于

==:等于

154216944.png

(注意:上面例子中最后一个命令使用的是通配符,当“==”和“[[]]”一起使用的时候才有效)

=~:用于正则表达式匹配。后边为匹配的模式,默认是用的扩展的正则表达式。如果要使用基本正则表达式则模式需要使用[]。模式不要用引号。(有待进一步验证)

094450747.png

-z $string:为空则为真,不空则为假

-n $string:不空则为真,为空则为假

111150250.png

3、文件测试

-f:测试其是否为普通文件,即ls -l时文件类型为-的文件。

-d:测试其是否为目录文件,即ls -l时文件类型为d的文件。

-e:测试文件是否存在;存在为真,否则为假。

-r:测试文件对当前用户来说是否可读。

-w:测试文件对当前用户来说是否可写。

-x:测试文件对当前用户来说是否可执行。

-s:测试文件大小是否不空,不空则真,空则为假。


四、位置参数

在bash脚本中还可以对脚本本身及其参数做引用

$0:引用脚本自身。

$*:除命令外的所有参数

$@:除命令外的所有参数

$nu:像对应位置的参数。

$#:表示所有参数的数量。

例如我们先来写一个脚本,再来看这个脚本的运行结果。

114455259.png

shell真是有趣,要熟练运用还要多做练习。