文章目录
- [一、test、[]、[[]]、(())、()、" "、' ' 的区别](#一、test、[]、[[]]、(())、()、" "、' ' 的区别)
-
- 1.1、test条件测试
- [1.2、 [](中括号)条件测试](#1.2、 [](中括号)条件测试)
- 1.3、[[]]条件测试
- 1.4、(())与()
- [1.5、" " 和 ' '](#1.5、" " 和 ' ')
- 二、使用示例
- 三、总结
-
- [3.1、不同符号测试表达式[ ]、[[ ]]、(( ))、test的区别](#3.1、不同符号测试表达式[ ]、[[ ]]、(( ))、test的区别)
在上一篇文章 《shell脚本中的if语句》中将了条件表达式中可以使用test、[]、[[]]、(())。接下来一起看一下有什么区别及使用场景。
本文列举常用的条件测试:[ ]
、[[ ]]
、$(())
和$()
、 test
、" "
和 ' '
以及他们的应用范围,简单易懂
一、test、[]、[[]]、(())、$()、" "、' ' 的区别
条件测试常用的语法:
条件测试语法 | 说明: |
---|---|
test 测试表达式 | test命令进行条件测试表达式 |
[ 测试表达式 ] | 通过"[]"(单中括号)进行条件测试表达式,同test,推荐使用 |
[[ 测试表达式 ]] | 通过"[[]]"(双中括号)进行条件测试表达式,可以使用通配符等进行模式匹配 |
(( 测试表达式 )) | 通过"(())"(双小括号)进行条件测试表达式,一般用于if语句里,只适用于整数 |
1.1、test条件测试
test条件测试的语法格式为:test <测试表达式>
在test命令中使用-f选项(文件存在且为普通文件则表达式成立)测试文件
在test命令中使用-z选项(如果测试字符串的长度为0,则表达式成立)测试字符串。
bash
[root@centos app]# touch bb.txt
[root@centos app]# test -f bb.txt && echo true || echo false
true
#在test命令中使用-z选项(如果测试字符串的长度为0,则表达式成立)测试字符串。
[root@centos app]# test -z "hello" && echo 1 || echo 0
0
[root@centos app]# char="hello"
[root@centos app]# test -z "$char" && echo 1||echo 0
0
[root@centos app]# char=""
[root@centos app]# test -z "$char" && echo 1||echo 0
1
1.2、 [](中括号)条件测试
[]条件测试的语法格式为:[ 测试表达式 ]
注意:
中括号内部的两端都要有空格
,[]和test等价,即test的所有判断选项都可以直接在[]里使用。
支持数值
、字符串
和文件条件
测试。多个表达式之间使用-a(与)
或-o(或)
连接
bash
[root@centos app]# touch bb.txt
[root@centos app]# [ -f bb.txt ] && echo true || echo false
true
# 数值
if [ $n1 -gt $2 ]; then
echo "$n1 大于 $n2"
fi
# 字符串
if [ "s1" = "s2" ]; then
echo "相等"
fi
# 文件
if [ -e "file.txt" ]; then
echo "File exists"
fi
1.3、[[]]条件测试
[[]]
是 Bash 的扩展,提供了更多的功能,包括高级字符串比较、正则表达式匹配等。
[[]]条件测试的语法格式为:[[ 测试表达式 ]]。 注意:双中括号里的两端也要有空格。
[[]]表达式与[]和test用法的选项部分是相同的,支持
数值
、字符串
和文件条件测试
。
[[ ]]
与 [ ]
和test的区别在于:
- 在[[ ]]中可以使用通配符等进行模式匹配;
- 并且&&、||、>、<等操作符可以应用于[[ ]]中,但不能应用于[ ]中;
- 在[ ]中一般使用-a、-o、-gt(用于整数)、-lt(用于整数)等操作符代替上文提到的用于[[]]中的符号
[[ ]]
是bash shell中引入的新特性, 它在功能上类似于[ ]
,属于[ ]
的扩展, 且支持逻辑运算符 &&(与)
和 ||(或)
bash
if [[ "a" = "a" && "b" = "b" ]]
then
echo "True"
else
echo "False"
fi
1.4、(())与()
双圆括号(( )):表示数学表达式
在判断命令中只允许在比较中进行简单的算术操作,而双圆括号提供更多的数学符号,而且在双圆括号里面的'>','<'号不需要转义。
1、使用(())时,运算符两边需要有空格;
2、(())算数表达式的值在if和while判断时不用在前面加
$
;在echo输出值时需要加$
3、let和(())都只能对整数进行运算赋值;
bash
# a>b且a<c
(( a > b )) && (( a < c ))
num1=5
num2=3
sum=$((num1 + num2))
echo $sum # 输出 8
$(())
与 $()
区别
$()
和$(( ))
是用于执行命令并获取其输出的两种不同语法
$()
:用于执行命令并获取输出
$(())
:用于执行算术表达式并获取计算结果
bash
# $() 示例
a=$(echo "aaa")
echo "输出:$a" # 输出:aaa
# $(()) 示例
b=$(( 1 + 2))
echo "输出:$b" # 输出:3
1.5、" " 和 ' '
单引号 主要用于保持字符串的原样输出
双引号 则用于解析和修改字符串的内容
bash
#变量解析
s="world"
echo "hello, $s !" # 输出: hello, world !
echo 'hello, $s !' # 输出: hello, $s !
#特殊字符转义
echo "aaa\"bb" # 输出: aaa"bb
echo 'aaa\"bb' # 输出: aaa\"bb
二、使用示例
2.1、a>b且a<c
bash
(( a > b )) && (( a < c ))
[[ $a > $b ]] && [[ $a < $c ]]
[ $a -gt $b -a $a -lt $c ]
2.2、a>b或a<c
bash
(( a > b )) || (( a < c ))
[[ $a > $b ]] || [[ $a < $c ]]
[ $a -gt $b -o $a -lt $c ]
2.3、正则表达式
bash
a="merry"
if [[ "$a" == m* ]];then
echo "hello,merry"
fi
2.4、if利用read传参判断
bash
#!/bin/bash
read -p "please input a score:" score
echo -e "your score [$score] is judging by sys now"
if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then
echo "sorry,you are lost!"
elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then
echo "just soso!"
elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then
echo "good job!"
else
echo "input score is wrong , the range is [0-100]!"
fi
三、总结
3.1、不同符号测试表达式[ ]、[[ ]]、(( ))、test的区别
测试表达式符号 | [ ] | test | [[ ]] | (( )) |
---|---|---|---|---|
边界是否需要空格 | 需要 | 需要 | 需要 | 不需要,有空格不报错 |
逻辑操作符 | -a、-o、! | -a、-o、! | &&、||、! | &&、||、! |
整数比较操作符 | -eq、-gt、-ge、-lt、-le | -eq、-gt、-ge、-lt、-le | -eq、-gt、-ge、-lt、-le或=、>、>=、<、<= | =、>、>=、<、<= |
字符串比较操作符 | =、==、!= | =、==、!= | =、==、!= | =、==、!= |
是否支持通配符匹配 | 不支持 | 不支持 | 支持 | 不支持 |