如何在dash(/bin/sh)中匹配变量或字符串的开头?
dash环境匹配字符串开头的实现方法
dash 作为严格遵循 POSIX 标准的轻量 shell,原生的 [ 测试命令不支持通配符匹配逻辑,你之前直接写 "Hello*" 会被当成普通字符串匹配星号本身,自然无法生效。下面是3种兼容dash的可行方案:
方案1:使用case语句(最推荐)
case是POSIX标准原生支持的语法,无需依赖任何外部命令,性能最优,写法也最简洁:
var="Hello World" case "$var" in # 匹配Hello开头的所有字符串 Hello*) echo "Match" ;; # 其他不匹配的情况 *) echo "No match" ;; esac
方案2:使用参数扩展判断
利用shell的前缀删除参数扩展逻辑,判断前缀是否存在:
prefix="Hello" var="Hello Kitty" # ${var#"$prefix"} 会删除变量开头匹配到的前缀,如果结果和原变量不同,说明匹配成功 if [ "${var#"$prefix"}" != "$var" ]; then echo "Match" fi
这种方案适合前缀需要动态传参的场景,同样是纯shell内置操作,性能很高。
方案3:调用grep做正则匹配
如果需要更复杂的匹配规则,可以调用外部grep命令实现:
var="Hello World" # -q参数让grep不输出结果,只返回退出状态码 if printf '%s\n' "$var" | grep -q '^Hello'; then echo "Match" fi
注意不要用echo输出变量内容匹配,避免变量里带反斜杠等特殊字符时被echo转义导致结果异常。
注意:很多bash教程里提到的
[[ "$var" = Hello* ]]写法是bash的扩展语法,dash不支持,不要在dash环境下使用。
内容的提问来源于stack exchange,提问作者user16765853
相关产品推荐
相关产品推荐

