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 脚本中进行条件判断的有力工具,特别是在处理字符串和文件时。它提供了更多的灵活性和强大的功能,如正则表达式匹配。

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

相关文章
|
1月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
5天前
|
存储 Shell 数据安全/隐私保护
Shell 内建命令:Shell 的内在魔力
Shell 内建命令比外部命令执行快,不需额外进程。`type` 命令用来检查命令类型。内建命令如 `cd`、`alias` 和 `echo` 直接在 Shell 中执行,不涉及磁盘 I/O。`type` 示例展示了 `cd` 是内建的,`ifconfig` 是外部的。`bash` 包含多种内建命令,如 `cd` 用于切换目录,`alias` 定义别名,`read` 从输入读取数据。`echo` 默认加换行,`echo -n` 可避免。
18 5
|
5天前
|
Shell 虚拟化
分布式系统详解--框架(Zookeeper-基本shell命令)
分布式系统详解--框架(Zookeeper-基本shell命令)
10 1
|
8天前
|
安全 Shell Linux
探索Linux命令chsh:更改用户的默认shell
`chsh`是Linux命令,用于更改用户的默认登录shell。它涉及用户环境配置和系统安全,允许用户选择更适合自己的shell以提升效率。命令有交互式选项和参数如`-s`来指定新shell。在使用时要注意新shell的可执行性、权限问题及选择合适的shell。例如,要更改为bash,用户可运行`chsh`后按提示操作,而root用户能用`sudo chsh -s /bin/zsh john`为用户`john`设定zsh。在更改前,确认shell路径、权限,并了解不同shell的特点。
|
5天前
|
分布式计算 Hadoop Shell
分布式系统详解--框架(Hadoop-基本shell命令)
分布式系统详解--框架(Hadoop-基本shell命令)
8 0
|
9天前
|
Shell Windows
Shell test [] 命令:条件判断的艺术
`test` 命令在Shell脚本中用于条件检测,涉及数值、字符串和文件比较。例如,`test $a -eq $b` 检查两个数是否相等;`-e` 检查文件是否存在;`-w` 检查文件是否可写。数值比较不支持 `&gt;=` 和 `&lt;=`,需用 `-ge` 和 `-le`。字符串比较时注意空值,使用双引号。逻辑运算包括 `-a`(与)、`-o`(或)和 `!`(非)。文件类型和权限检测也是`test`的重要用途。
10 0
|
22天前
|
Shell Linux BI
linux shell脚本中 if 条件判断
linux shell脚本中 if 条件判断
13 0
|
1月前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
1月前
|
存储 Shell 数据安全/隐私保护
ZooKeeper【基础知识 04】控制权限ACL(原生的 Shell 命令)
【4月更文挑战第11天】ZooKeeper【基础知识 04】控制权限ACL(原生的 Shell 命令)
37 7
|
1月前
|
分布式计算 Hadoop Shell
Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
【4月更文挑战第4天】Hadoop【基础知识 04】【HDFS常用shell命令】(hadoop fs + hadoop dfs + hdfs dfs 使用举例)
54 5