shell脚本中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的区别在于:

  1. 在[[ ]]中可以使用通配符等进行模式匹配;
  2. 并且&&、||、>、<等操作符可以应用于[[ ]]中,但不能应用于[ ]中;
  3. 在[ ]中一般使用-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或=、>、>=、<、<= =、>、>=、<、<=
字符串比较操作符 =、==、!= =、==、!= =、==、!= =、==、!=
是否支持通配符匹配 不支持 不支持 支持 不支持

参考文章:https://www.cnblogs.com/moox/p/12841943.html

相关推荐
高hongyuan2 个月前
shell脚本一键部署nginx
运维·服务器·nginx·shell脚本
954L2 个月前
Mysql8异地定时自动备份
mysql·安全·备份·shell脚本·定时任务·异地灾备
I'm Jie2 个月前
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
linux·ssh·shell·shell脚本·shell编程
醉心编码2 个月前
批量处理文件权限:解决‘/usr/bin/chmod: Argument list too long’的有效方法
shell脚本
芝法酱3 个月前
芝法酱学习笔记(0.4)——SpringBoot多模块项目打包,resource分离,lib分离,启动脚本
linux·maven·shell脚本·springboot打包·资源分离
五月天的尾巴4 个月前
shell脚本中$0 $1 $# $@ $* $? $$ 的各种符号意义详解
shell脚本
骅青5 个月前
shell脚本自动化安装启动各种服务
linux·云计算·shell脚本
Holen&&Beer5 个月前
17_Shell好用工具:awk
linux·shell·shell脚本
2301_764142166 个月前
22 Shell编程之免交互
linux·运维·网络·安全·shell脚本·expect·here document