如何在不创建子进程的情况下删除Bash变量末尾的\r字符?
你之前的写法失效的核心原因是:Bash 的普通单/双引号不会解析\r、\x0d这类转义序列,你写的${VAR%\r}里的\r会被当成字面量的「反斜杠+r」两个字符,自然匹配不到变量里的回车符。
以下是纯Bash内置操作的方案,全程不创建子进程:
方案1:全局删除所有\r字符(最通用)
用Bash参数扩展的全局替换功能,搭配ANSI-C引号$'\r'生成真正的回车符,直接把所有回车替换为空:
VAR=${VAR//$'\r'/}
操作后可以用hexdump验证结果:
$ hexdump -C <<< "$VAR" 00000000 68 65 6c 6c 6f 0a |hello.| 00000006
可以看到0x0d(\r)已经被完全删除,仅保留了需要的0x0a(\n)。
方案2:仅删除末尾的\r(适配你当前的场景)
如果你确定\r仅出现在变量末尾,也可以用后缀移除的写法实现:
# 先移除末尾的\r\n整体,再补回需要保留的\n VAR=${VAR%$'\r\n'}$'\n'
这个写法不会影响变量中间可能存在的\r字符。
内容的提问来源于stack exchange,提问作者audeoudh
相关产品推荐
相关产品推荐

