我有档案a.txt
具有以下内容
aaa bbb
当我执行以下脚本时:
while read line
do
echo $line
done < a.txt > b.txt
生成b.txt
包含以下内容
aaa bbb
可见,线的前导空间已被移除。我怎样才能保留前导空间?
这里有几个问题:
- 除非
IFS
被清除了,read
带前导和尾随空格。 echo $line
字符串--拆分和GLOB--扩展$line
,将其分解为单个单词,并将这些单词作为单独的参数传递给echo
命令。因此,即使IFS在read
时间,echo $line
仍然会丢弃前导和尾随空格,并将单词之间的空格运行更改为每个空格字符。另外,一行只包含字符。*
将展开为包含文件名列表。echo "$line"
是一个重大的改进,但仍然不能正确地处理诸如-n
,它将其视为回显参数本身。printf '%s\n' "$line"
就能完全解决这个问题。read
没有-r
将反斜杠视为连续字符,而不是文字内容,这样除非加倍以转义,否则不会将反斜杠包含在所产生的值中。
因此:
while IFS= read -r line; do
printf '%s\n' "$line"
done