我有文件a.txt
包含以下内容
aaa
bbb
当我执行以下脚本时:
while read line
do
echo $line
done < a.txt > b.txt
生成的b.txt
包含以下内容
aaa
bbb
可以看出,行的前导空格已被删除。如何保留前导空格?
Bash FAQ 条目对此进行了介绍逐行读取数据 http://mywiki.wooledge.org/BashFAQ/001#Trimming.
读取命令修改读取的每一行;默认情况下,它会删除所有前导和尾随空白字符(空格和制表符,或 IFS 中存在的任何空白字符)。如果不需要,则必须清除 IFS 变量:
# Exact lines, no trimming
while IFS= read -r line; do
printf '%s\n' "$line"
done < "$file"
正如查尔斯·达菲(Charles Duffy)正确指出的那样(我因专注于IFS
问题);如果你想看到输出中的空格,你还需要在使用变量时引用它,否则 shell 将再次删除空格。
请注意与原始代码相比,引用的代码片段中的一些其他差异。
使用-r
论证read
包含在先前链接页面顶部的一句话中。
读取的 -r 选项可防止反斜杠解释(通常用作反斜杠换行符对,以继续多行)。如果没有此选项,输入中的任何反斜杠都将被丢弃。您几乎应该始终将 -r 选项与 read 一起使用。
至于使用printf
代替echo
那里的行为echo
不幸的是,它在所有环境中都不是可移植的一致的,并且这些差异可能很难处理。printf
另一方面是一致的并且可以完全稳健地使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)