You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本中`${line#*'Caused By'}` != `$line`是什么意思?

拆解Shell表达式 ${line#*'Caused By'} != $line

嘿,咱们一步步把这个表达式的意思和作用掰扯清楚~

1. 先搞懂${line#*'Caused By'}是什么

这是Shell里的参数扩展语法,专门用来对变量内容做字符串截取:

  • # 代表从字符串的开头开始匹配并删除指定模式
  • *'Caused By' 是匹配规则:*是通配符,能匹配任意长度的任意字符(包括空字符),后面跟着字面量'Caused By'
  • 整体效果:把$line里从开头到第一次出现Caused By(连带着Caused By本身)的部分全部删掉,返回剩下的内容。

举两个例子直观感受下:

  • 假如$line是 2024-05-20 ERROR Caused By: NullPointerException,那${line#*'Caused By'}的结果就是 : NullPointerException
  • 要是$line里压根没Caused By这串字符,这个扩展就不会做任何修改,结果和原$line一模一样。

2. 整个表达式的核心作用

这是一个条件判断,本质是在检查:变量$line的内容里是否包含Caused By这个子串

  • 如果$line里有Caused By,扩展后的字符串肯定和原$line不一样,判断结果为true(条件成立)
  • 如果$line里没有Caused By,扩展后的字符串和原$line完全相同,判断结果为false(条件不成立)

实际用在哪?

这种判断大多用在日志处理脚本里,比如遍历日志的每一行,筛选出所有包含异常栈信息中Caused By的行,方便快速定位错误根源。比如常见的脚本片段:

while read -r line; do
  if [[ ${line#*'Caused By'} != "$line" ]]; then
    echo "$line"  # 输出所有包含Caused By的日志行
  fi
done < error.log

内容的提问来源于stack exchange,提问作者srikanth chintal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:07:18