复合条件测试
1.if-then 语句允许使用布尔逻辑将测试条件组合起来。可以使用以下两种布尔运算符。
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
第一种布尔运算使用布尔运算符 AND 来组合两个条件。要执行 then 部分的命令,两个条件都必须满足。
第二种布尔运算使用 OR 布尔运算符来组合两个条件。如果任意条件为真,那么 then 部分的命令就会执行。
下面来演示 AND 布尔运算符的用法:
$ cat AndBoolean.sh
#!/bin/bash
# Testing an AND Boolean compound condition
#
if [ -d $HOME ] && [ -w $HOME/newfile ]
then
echo "The file exists and you can write to it."
else
echo "You cannot write to the file."
fi
$
$ ls -l $HOME/newfile
ls: cannot access '/home/christine/newfile': No such file or directory
$
$ ./AndBoolean.sh
You cannot write to the file.
$
$ touch $HOME/newfile
$
$ ./AndBoolean.sh
The file exists and you can write to it.
$
2.if-then 的高级特性
a.在子 shell 中执行命令的单括号。
b.用于数学表达式的双括号。
c.用于高级字符串处理功能的双方括号
(1)使用单括号
单括号允许在 if 语句中使用子 shell,单括号形式的 test 命令格式如下:
(command)
bash shell 执行 command 之前,会先创建一个子 shell,然后在其中执行命令。
如果命令成功结束,则退出状态码会被设为 0,then 部分的命令就会被执行。
如果命令的退出状态码不为 0,则不执行 then 部分的命令。
$ cat SingleParentheses.sh
#!/bin/bash
# Testing a single parentheses condition
#
echo $BASH_SUBSHELL
if (echo $BASH_SUBSHELL)
then
echo "The subshell command operated successfully."
else
echo "The subshell command was NOT successful."
fi
$
$ ./SingleParentheses.sh
01
The subshell command operated successfully.
$
(2)使用双括号
双括号命令符号
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔 AND
| 位布尔 OR
&& 逻辑 AND
|| 逻辑 OR
$ cat DoubleParentheses.sh
#!/bin/bash
# Testing a double parentheses command
#
val1=10
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2,"
echo "which is greater than 90."
fi
$
$ ./DoubleParentheses.sh
The square of 10 is 100,
which is greater than 90.
$
(3)使用双方括号
双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:
[[ expression ]]
expression 可以使用 test 命令中的标准字符串比较。除此之外,它还提供了 test 命令所不具备的另一个特性——模式匹配。
$ cat DoubleBrackets.sh
#!/bin/bash
# Using double brackets for pattern matching
#
if [[ $BASH_VERSION == 5.* ]]
then
echo "You are using the Bash Shell version 5 series."
fi
$
$ ./DoubleBrackets.sh
You are using the Bash Shell version 5 series.
$