大家好,今天我们来聊聊 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 ] | 错 ([[]] 不能使用 |
-z $str1 || -z $str2 | 错([] 不能在内部进行逻辑运算) | [ -z $str1 || -z $str2 ] | 对 |
[ ] 与逻辑运算
[[ ]]
支持逻辑运算,但有一些限制。例如,它不支持 -a
和 -o
选项,而是使用 &&
和 ||
进行逻辑与和逻辑或:
# 错误的写法,[[]] 不能使用 -o 和 -a 选项
[[ -z $str1 -o -z $str2 ]]
# 正确的写法,使用 || 代替 -o
[[ -z $str1 ]] || [[ -z $str2 ]]
[ ] 支持正则表达式
[[ ]]
的一个强大特性是支持正则表达式匹配。这对于字符串的复杂验证非常有用:
# 正则表达式匹配用法
[[ str=~ regex ]]
示例:使用正则表达式检测手机号
下面是一个使用正则表达式检测手机号的示例:
代码语言:bash复制#!/bin/bash
read phone
# 正则表达式,匹配以1开头,后跟10个数字的手机号
if [[ $phone =~ ^1[0-9]{10}$ ]]; then
echo '是手机号'
else
echo '不是手机号'
fi
总结
[[ ]]
命令是 Shell 脚本中进行条件判断的有力工具,特别是在处理字符串和文件时。它提供了更多的灵活性和强大的功能,如正则表达式匹配。
以上就是今天的内容,希望这篇文章能够帮助你更好地理解和使用 [[ ]]
命令。