当前位置:首页 > Linux > 正文

Linux如何比较字符串?

在Linux中比较字符串常用test命令或双括号[[ ]],通过=、!=运算符判断相等性,-z/-n检查空/非空字符串,注意变量加双引号防止语法错误,[ “$str1” = “$str2” ]。

使用 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(复杂文本处理)

适合在文本流或脚本中同时处理多行数据。

Linux如何比较字符串?  第1张

示例:比较两列数据

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

关键注意事项

  1. 空格处理

    • 赋值时无空格:str="value"
    • 比较时有空格:[ "$a" = "$b" ]
    • 遗漏空格会导致语法错误(如 [$a=$b] 无效)。
  2. 大小写敏感
    Linux默认区分大小写,需忽略大小写时,可转换变量:

    if [[ "${str1,,}" == "${str2,,}" ]]; then  # Bash 4.0+ 小写转换
  3. 特殊字符转义
    若字符串含 、 等,在 [ ] 中需用引号包裹;[[ ]] 自动处理特殊字符。

  4. 空变量检查
    始终用 -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扩展

最佳实践

  • 脚本中优先使用 [[ ]],避免兼容问题时改用 [ ]
  • 涉及大量文本处理时,选择 awkgrep 提升效率。
  • 始终包裹变量引号,明确处理空值和特殊字符。

引用说明

  • Bash手册(man bash)中关于条件表达式(CONDITIONAL EXPRESSIONS)的章节。
  • POSIX Shell标准(IEEE Std 1003.1)对 testcase 的定义。
  • GNU Awk用户指南(https://www.gnu.org/software/gawk/manual/)。
0