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
相关产品推荐
相关产品推荐

