Shell [[]] 命令:条件判断的升级版

简介: `[[ ]]` 是 Bash 中增强型的条件判断命令,提供比 `[ ]` 更多的灵活性,如无需引号包裹变量、直接字符串比较及正则支持。例如:```markdown- 不加引号比较:`[[ -z $str1 ]]`- 逻辑运算:`[[ -z $str1 ]] || [[ -z $str2 ]]`- 正则匹配:`[[ $phone =~ ^1[0-9]{10}$ ]]````它不支持 `-a` 和 `-o`,但能用 `&&` 和 `||` 进行逻辑操作。用于复杂字符串验证和文件处理时非常有用。

大家好,今天我们来聊聊 Shell 脚本中的条件判断加强版——[[ ]] 命令。如果你对基本的 [] 命令已经熟悉,那么 [[ ]] 将是你的下一个升级技能点。

[[ ]] 命令简介

[[ ]] 命令与 test[] 命令相似,用来检测某个条件是否成立。但它提供了更多的功能和灵活性,特别是在处理字符串和文件时。

# 当 expression 条件成立时,退出状态为 0,否则为非 0 值
[[ expression ]]  # 表达式左右各有一个空格

[[ ]] 的优势

相比传统的 [][[ ]] 有一些显著的优势:

  • 不需要对变量加双引号,即使变量为空也不会导致错误。
  • 支持字符串的直接比较,不需要对 <> 进行转义。
  • 支持正则表达式匹配。

示例:字符串和逻辑运算

下面是一个使用 [[ ]] 进行字符串判断和逻辑运算的示例:

#!/bin/bash

read str1
read str2

# 检测字符串是否为空,不需要对变量名加双引号
if [[ -z $str1 ]] || [[ -z $str2 ]]; then
  echo "字符串不能为空"
  exit 1
# 直接使用 < 比较,不需要转义
elif [[ $str1 < $str2 ]]; then
  echo '$str1 < $str2'
else
  echo '$str1 >= $str2'
fi

[[]] 也支持逻辑运算

[] 和 [[]] 写法对比

test 或 [] 写法是否对错 [[]] 写法是否对错
[ -z "$str1" ] \ \ [ -z "$str2" ] [[ -z $str1 ]] \ \ [[ -z $str2 ]]
[ -z "$str1" -o -z "$str2" ] [[ -z $str1 -o -z $str2 ]] 错 ([[]] 不能使用 -o-a 选项)
[ -z $str1 \ \ -z $str2 ] 错([] 不能在内部进行逻辑运算) [[ -z $str1 \ \ -z $str2 ]]

[[ ]] 与逻辑运算

[[ ]] 支持逻辑运算,但有一些限制。例如,它不支持 -a-o 选项,而是使用 &&|| 进行逻辑与和逻辑或:

# 错误的写法,[[]] 不能使用 -o 和 -a 选项
[[ -z $str1 -o -z $str2 ]]

# 正确的写法,使用 || 代替 -o
[[ -z $str1 ]] || [[ -z $str2 ]]

[[ ]] 支持正则表达式

[[ ]] 的一个强大特性是支持正则表达式匹配。这对于字符串的复杂验证非常有用:

# 正则表达式匹配用法
[[ str=~ regex ]]

示例:使用正则表达式检测手机号

下面是一个使用正则表达式检测手机号的示例:

#!/bin/bash

read phone

# 正则表达式,匹配以1开头,后跟10个数字的手机号
if [[ $phone =~ ^1[0-9]{
   10}$ ]]; then
  echo '是手机号'
else
  echo '不是手机号'
fi

总结

[[ ]] 命令是 Shell 脚本中进行条件判断的有力工具,特别是在处理字符串和文件时。它提供了更多的灵活性和强大的功能,如正则表达式匹配。

以上就是今天的内容,希望这篇文章能够帮助你更好地理解和使用 [[ ]] 命令。

相关文章
|
28天前
|
人工智能 Shell iOS开发
AI Shell:在命令行里“对话” AI ,微软推出将 AI 助手引入命令行的 CLI 工具,打造对话式交互命令行
AI Shell 是一款强大的 CLI 工具,将人工智能直接集成到命令行中,帮助用户提高生产力。AI Shell 支持多种 AI 模型和助手,通过多代理框架提供丰富的功能和灵活的使用模式。
92 7
|
1月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
41 1
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
78 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
2月前
|
Shell 知识图谱
Shell printf 命令
10月更文挑战第3天
25 1
|
2月前
|
Unix Shell Linux
常见的shell命令
shell常用命令
57 11
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
142 5
|
2月前
|
Shell PHP
Shell echo命令
10月更文挑战第3天
23 0
|
2月前
|
JSON Java Shell
Dockerfile中RUN、CMD、ENTRYPOINT、SHELL命令的区别
理解这些指令的差异和应用场景,有助于构建高效、灵活且易于管理的Docker镜像。在实际应用中,根据需要选择合适的指令,可以有效地控制镜像构建和容器运行的行为。
226 0
|
2月前
|
SQL Shell 数据库
在TDengine容器中创建初始化数据库的Shell命令实例
以上就是在Docker容器环境中部署并初始化TDengine数据库的全过程,希望对你有所帮助。
87 0