Bash脚本中为变量赋值时如何保留Windows换行符?
解决Bash变量保留Windows换行符的问题
你的代码失效的核心原因是输出变量时未用双引号包围,导致Bash将换行符解析为空格;另外用echo+命令替换的赋值方式完全没必要,反而容易引发问题。以下是两种可行的解决方案:
方法一:直接用ANSI-C引号赋值(推荐)
Bash支持$'...'语法,能直接解析\r、\n这类转义序列,无需借助echo。赋值后输出时记得用双引号包围变量,避免分词丢失换行:
foo=$'one\r\ntwo\r\nthree\r\n' echo -n "$foo" > Readme.txt
方法二:修正原命令的输出逻辑
如果坚持用命令替换的方式赋值,只需确保输出变量时用双引号包围即可(赋值时你已经用双引号包围了命令替换,变量本身其实保留了换行符):
foo="$(echo -n one$'\r'$'\n'two$'\r'$'\n'three$'\r'$'\n')" # 必须用双引号包围变量,否则换行会被替换为空格 echo -n "$foo" > Readme.txt
补充说明
- 当执行
echo $foo时,Bash会启动分词机制,将变量中所有属于IFS(默认包含空格、换行、制表符)的字符替换为空格,这就是换行消失的直接原因。 - 命令替换
$(...)会保留输出内容中间的换行符,仅会去掉末尾的连续换行,所以你原代码中变量foo其实已经包含了换行,只是输出时没加引号导致显示异常。
内容的提问来源于stack exchange,提问作者Dan R.
相关产品推荐
相关产品推荐

