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

2024-06-17 14:19:12 浏览数 (2)

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

[ ] 命令简介

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

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

[ ] 的优势

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

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

示例:字符串和逻辑运算

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

代码语言:bash复制
#!/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 选项,而是使用 &&|| 进行逻辑与和逻辑或:

代码语言:bash复制
# 错误的写法,[[]] 不能使用 -o 和 -a 选项
[[ -z $str1 -o -z $str2 ]]

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

[ ] 支持正则表达式

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

代码语言:bash复制
# 正则表达式匹配用法
[[ str=~ regex ]]

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

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

代码语言:bash复制
#!/bin/bash

read phone

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

总结

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

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

0 人点赞