如何让Bash参数替换在无等号时返回空字符串?
实现Bash参数的精准截取:仅返回等号后内容(无等号则返回空)
可以通过纯Bash参数嵌套替换实现单个表达式的需求,完全符合你保持简洁性且不依赖外部工具的要求:
${${1#*=}//${1%%=*}/}
直接把现有脚本里的"${1#*=}"替换成这个表达式即可,修改后的CLI解析循环如下:
while [[ "$#" -gt 0 ]]; do case $1 in -h=*|--help=*|-h|--help) print_help "${${1#*=}//${1%%=*}/}";; -p=*|--processes=*|-p|--processes) bootstrap_processes "${${1#*=}//${1%%=*}/}";; -v=*|--validate=*|-v|--validate) validate_models "${${1#*=}//${1%%=*}/}";; *) printf "%s\n\n" "Unknown parameter passed: $1"; __print_help; exit 2 ;; esac shift done
替换逻辑说明
这个嵌套替换分两步执行:
- 第一步:
${1#*=}:标准前缀删除,删除第一个=及之前的所有字符。如果参数包含=,得到等号后的内容;如果不包含=,得到原参数本身。 - 第二步:
${...//${1%%=*}/}:把第一步的结果中,匹配${1%%=*}的部分替换为空。- 当参数包含
=时,${1%%=*}是等号前的内容,和第一步得到的等号后内容完全不同,替换不生效,保留等号后的内容。 - 当参数不包含
=时,${1%%=*}就是整个参数本身,和第一步得到的结果完全一致,替换后变为空字符串。
- 当参数包含
如果觉得嵌套写法有点绕,也可以用另一种逻辑等价的写法:
${1:+${1#*=}}${1%%*=}
不过第一种纯嵌套替换的可读性和简洁性更优。
内容的提问来源于stack exchange,提问作者ikaerom
相关产品推荐
相关产品推荐

