如何在Bash case语句中匹配指定后缀的字符串?
Bash中case语句匹配字符串末尾的问题解决
问题原因
你原来的代码没成功,是因为给模式加了双引号——bash里双引号会把里面的*变成普通字符,不再是通配符。这时候case会去匹配字面量的* unit test字符串,自然和1. unit test对不上。
解决方法
1. 正确使用case语句的模式匹配
去掉模式的双引号,让*发挥通配符的作用,直接匹配任意前缀:
case "1. unit test" in *" unit test") echo 1;; esac
或者也可以不套引号,直接写:
case "1. unit test" in * unit test) echo 1;; esac
这里的*会匹配任意长度的前缀(包括空字符串),只要后面跟着 unit test就能匹配成功。
2. 用[[ ]]结合正则匹配
如果需要更灵活的字符串结尾检查,可以用bash的条件判断[[ ]]配合正则表达式的$锚定结尾:
str="1. unit test" if [[ $str =~ " unit test$" ]]; then echo 1 fi
$在正则里表示字符串的末尾,确保匹配的是结尾部分。
3. 用参数扩展判断
利用bash的参数扩展${变量%后缀},这个语法会去掉变量末尾匹配的后缀。如果处理后的变量和原变量不一样,就说明原变量是以该后缀结尾的:
str="1. unit test" suffix=" unit test" if [[ "${str%$suffix}" != "$str" ]]; then echo 1 fi
内容的提问来源于stack exchange,提问作者iaquobe
相关产品推荐
相关产品推荐

