Bash中如何转义字符串变量内的特殊语法字符
问题
已知条件
现有一个字符串变量,内容包含Bash用于扩展操作、作为分隔符的特殊字符,变量定义示例如下:
path="/this/path/contains whitespace/and/asterisk */myfile.txt"
实现目标
需要通过反斜杠转义的方式展开该变量(要求直接禁用特殊字符的语法效果,不能仅通过引号包裹内容实现),即执行处理命令后,输出结果如下:
/this/path/contains\ whitespace/and/asterisk\ \*/myfile.txt
咨询问题
Bash中是否存在可直接实现该功能的内置命令,无需手动逐一匹配处理所有特殊字符?
解答
存在符合要求的内置实现,不需要手动编写逐字符匹配替换的逻辑:
使用Bash内置printf命令的%q格式符即可完全满足需求。该格式符的设计目标就是将字符串转换为Shell可无歧义重新解析的格式,默认通过反斜杠转义特殊字符,不会用引号包裹内容。
使用方式
printf '%q\n' "$path"
针对示例中的path变量,执行上述命令的输出完全匹配预期:
/this/path/contains\ whitespace/and/asterisk\ \*/myfile.txt
所有空格、通配符等会触发Bash分词、通配扩展、语法解析的特殊字符都会被自动添加反斜杠转义,不需要额外手动处理。
补充说明:Bash 4.4及以上版本支持的
${var@Q}参数扩展虽然也能实现特殊字符转义、输出可复用的Shell输入格式,但该语法会优先选择单引号包裹的形式处理含特殊字符的字符串,不符合“反斜杠转义、不使用引号包裹”的要求,因此不适用于该场景。
内容的提问来源于stack exchange,提问作者Frank-Rene Schäfer
相关产品推荐
相关产品推荐

