使用 test
命令([ ]
或 [[ ]]
)
test
命令是Shell内置的字符串比较工具,支持 [ ]
(兼容性广)和 [[ ]]
(功能更强,推荐使用)。
基本语法
if [ "$str1" = "$str2" ]; then # 判断相等 if [[ "$str1" != "$str2" ]]; then # 判断不等 if [[ -z "$str" ]]; then # 判断空字符串 if [[ -n "$str" ]]; then # 判断非空字符串
示例
str1="hello" str2="world" if [[ "$str1" == "$str2" ]]; then echo "字符串相等" else echo "字符串不相等" # 输出此结果 fi
注意事项
- 引号的重要性:变量需用双引号包裹(如
"$str"
),避免含空格时被解析为多个参数。 - 等号写法: 和 在
[[ ]]
中通用,但在[ ]
中建议用 (兼容性更好)。 - 模式匹配:
[[ ]]
支持通配符(如[[ $file == *.txt ]]
)。
使用 case
语句
适用于多条件分支匹配,语法简洁且支持通配符。
示例:检查文件类型
file="document.pdf" case "$file" in *.txt) echo "文本文件" ;; *.pdf) echo "PDF文件" ;; # 匹配此项 *) echo "未知类型" ;; esac
使用 expr
命令(兼容旧系统)
老式方法,适用于不支持 [[ ]]
的环境(如某些Bourne Shell)。
示例
if expr "apple" : "apple" > /dev/null; then echo "匹配成功" # 输出此结果 fi
使用 awk
(复杂文本处理)
适合在文本流或脚本中同时处理多行数据。
示例:比较两列数据
echo "apple orange" | awk '{if ($1 == $2) print "相等"; else print "不等"}' # 输出"不等"
使用 grep
(模式匹配)
通过正则表达式间接比较,常用于过滤输出。
示例:检查变量是否包含子串
str="error: file not found" if echo "$str" | grep -q "error"; then echo "存在错误信息" # 输出此结果 fi
关键注意事项
-
空格处理:
- 赋值时无空格:
str="value"
- 比较时有空格:
[ "$a" = "$b" ]
- 遗漏空格会导致语法错误(如
[$a=$b]
无效)。
- 赋值时无空格:
-
大小写敏感:
Linux默认区分大小写,需忽略大小写时,可转换变量:if [[ "${str1,,}" == "${str2,,}" ]]; then # Bash 4.0+ 小写转换
-
特殊字符转义:
若字符串含 、 等,在[ ]
中需用引号包裹;[[ ]]
自动处理特殊字符。 -
空变量检查:
始终用-z
(空)或-n
(非空)显式判断,避免未定义变量导致的错误。
实际应用场景
场景1:用户输入验证
read -p "输入 yes 继续: " answer if [[ "$answer" =~ ^[Yy][Ee][Ss]$ ]]; then # 正则匹配 yes/YES/Yes echo "继续执行..." else echo "已取消" fi
场景2:服务状态监控
status=$(systemctl is-active nginx) if [[ "$status" == "active" ]]; then echo "Nginx 运行中" else echo "Nginx 未运行" fi
方法 | 适用场景 | 优势 |
---|---|---|
[[ ]] |
条件判断、模式匹配 | 功能强大,支持通配符和正则 |
case |
多分支匹配(如文件类型) | 语法简洁,可读性高 |
awk /grep |
文本流处理或复杂数据 | 适合管道操作 |
expr |
兼容旧系统 | 无需Bash扩展 |
最佳实践:
- 脚本中优先使用
[[ ]]
,避免兼容问题时改用[ ]
。 - 涉及大量文本处理时,选择
awk
或grep
提升效率。 - 始终包裹变量引号,明确处理空值和特殊字符。
引用说明:
- Bash手册(
man bash
)中关于条件表达式(CONDITIONAL EXPRESSIONS)的章节。- POSIX Shell标准(IEEE Std 1003.1)对
test
和case
的定义。- GNU Awk用户指南(https://www.gnu.org/software/gawk/manual/)。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/40333.html