Bash 3.2.57扩展通配符否定在参数替换失效,如何实现目标输出逻辑?
解决方案
针对Bash 3.2.57(macOS 12.6.8自带版本)的兼容场景,推荐以下几种实现方式:
方法1:条件判断(最直观可靠)
直接通过模式匹配判断字符串首字符,逻辑清晰,完全兼容老版本Bash:
s=abc [[ $s == a* ]] && echo "$s" || echo ""
- 当
s以a开头时输出原字符串,否则输出空内容; - 多行脚本形式:
s=abc if [[ $s == a* ]]; then echo "$s" else echo "" fi
方法2:参数替换(无需extglob)
利用Bash原生的前缀匹配替换特性,不用开启extglob选项即可实现需求:
s=abc echo "${s/#[!a]*/}"
- 原理:
${s/#pattern/}会匹配字符串开头的pattern,匹配成功则替换为空; - 当
s首字符不是a时,#[!a]*匹配整个字符串,最终输出空;首字符是a时,不匹配该模式,保留原字符串输出。
方法3:修正extglob用法(若需保留extglob场景)
如果一定要使用extglob选项,可结合条件判断实现:
shopt -s extglob s=abc [[ $s == !(a)* ]] && echo "" || echo "$s"
!(a)*匹配所有不以a开头的字符串,判断成立则输出空,否则输出原字符串。
内容的提问来源于stack exchange,提问作者XDR
相关产品推荐
相关产品推荐

