Bash基础知识-[[和]]用于条件测试

在Bash中,[[和]]是条件测试关键字,[是内置命令。[[和]]提供了比[和](test命令)更强大、更安全的条件测试方式,提供了模式匹配、正则表达式、更清晰的逻辑运算符等强大功能,是编写健壮Shell脚本的首选。

[[和]]与[和]的差别

基本语法

bash 复制代码
#[[和]]基本语法
if [[ expression ]]; then
    commands
fi

#[和]基本语法
if [ expression ]; then
    commands
fi

字符串比较

bash 复制代码
#[[ ]]实现字符串比较
[[ $string1 == $string2 ]]  #字符串相等
[[ $string1 != $string2 ]]  #字符串不相等
[[ $string1 < $string2 ]]   #字符串字典序小于
[[ $string1 > $string2 ]]   #字符串字典序大于
[[ -z $string ]]            #字符串为空
[[ -n $string ]]            #字符串非空
##注意: [[中使用==和!=时,右侧可以时一个模式(pattern),支持通配符,如下
[[ "filename" == *.txt ]]   #如果filename以.txt结尾则为真

#[ ]实现字符串比较

数值比较

bash 复制代码
#[[ ]]实现数值比较
[[ $num1 -eq $num2 ]]  #等于
[[ $num1 -ne $num2 ]]  #不等于
[[ $num1 -lt $num2 ]]  #小于
[[ $num1 -le $num2 ]]  #小于等于
[[ $num1 -gt $num2 ]]  #大于
[[ $num1 -ge $num2 ]]  #大于等于

#[ ]实现数值比较

文件测试

bash 复制代码
#[[ ]]实现文件检查
[[ -e file ]]  #文件/目录是否存在
[[ -f file ]]  #是否是普通文件
[[ -d file ]]  #是否是目录
[[ -s file ]]  #文件存在且非空
[[ -r file ]]  #文件可读
[[ -w file ]]  #文件可写
[[ -x file ]]  #文件可执行
[[ -L file ]]  #是否是符号链接

#[ ]实现文件检查

逻辑运算

bash 复制代码
#使用[和]实现逻辑条件判断
[[ ! expression ]]                #非
[[ expression1 && expression2 ]]  #与
[[ expression1 || expression2 ]]  #或

#egs,
if [ $age -gt 18 -a $age -lt 65 ]; then
    echo "您是工作年龄的成年人."
fi

if [ ! -f "/path/to/file" ]; then
    echo "文件不存在"
fi

#使用[[和]]实现逻辑条件判断
if [[ -f "/path/to/file" && -r "/path/to/file" ]]; then
    echo "文件存在且可读"
fi

if [[ "$name" == "Alice" || "$age" -gt 100 ]]; then
    echo "您是Alice或者是一位百岁老人"
fi

if [[ ! -d "/path/to/dir" ]]; then
    echo "这不是一个目录"
fi

模式匹配

bash 复制代码
#通配符模式匹配
[[ "$filename" == *.txt ]]    #以.txt结尾
[[ "$name" == [A-Z]* ]]       #以大写字母开头
[[ "$string" == *pattern* ]]  #包含pattern

#扩展通配符(需要shopt - s extglob)
shopt -s extglob
[[ "$file" == *@(.txt|.sh|.conf) ]]  #匹配多种扩展名

正则表达式匹配

bash 复制代码
#使用=~进行正则匹配
[[ "hello123" =~ ^[a-z]+[0-9]+$ ]] #匹配:字母开头后跟数字

#捕获组(BASH_REMACH数组)
if [[ "data: 2023-01-05" =~ ([0-9){4}-[0-9]{2}-[0-9]{2}) ]]; then
    echo "找到日期:${BASH_REMATCH[1]}"  #输出: 找到日期: 2023-01-15
fi

#邮箱验证示例
email="user@example.com"
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "有效的邮箱地址"
else
    echo "无效的邮箱地址"
fi
相关推荐
basketball61616 小时前
C++ 继承完全指南:从 is-a 关系到虚继承的底层真相
开发语言·c++
AIFQuant16 小时前
Java 对接全球股票实时报价:高可用架构与异常处理
java·开发语言·websocket·金融·架构·股票api
Huangjin007_17 小时前
【C++ STL篇(十)】深入理解 AVL 树:代码实现、旋转图解与平衡因子详解
开发语言·c++
小明同学0117 小时前
C++后端项目:统一大模型接入 SDK(四)
服务器·开发语言·c++·计算机网络·chatgpt
安妮的小熊呢17 小时前
CRMEB开源商城系统 & 标准版系统(PHP)开发规范
开发语言·javascript·php
子榆.17 小时前
CANN ATC编译器:模型从Python到达芬奇指令走了多远
开发语言·python·neo4j
Dontla17 小时前
Multi-Agent多智能体项目如何从MVP过渡到生产项目?
开发语言
兰令水17 小时前
topcode【随机算法题】【2026.5.20打卡-java版本】
java·开发语言·算法
我还记得那天18 小时前
C语言递归实现汉诺塔问题
c语言·开发语言
不吃土豆的马铃薯18 小时前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog