You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell中自动无故修剪空格问题求助:为何空格被删除?

处理文件时首尾空格丢失的问题

我用while IFS= read -r line; do ... done < file逐行处理文件内容时,发现行首尾的空格被自动删除(比如" a "变成"a"),这给实际使用带来了麻烦。查了相关文档没找到说明,而且printf也存在同样问题。

最小复现示例

touch example # 创建测试文件
echo "  exa    mple    " >> example # 写入带首尾空格的文本
cat example # 输出:  exa    mple    
echo $(cat example) # 输出:exa mple
rm example # 删除测试文件

另外这段代码也会出现同样问题:

while IFS= read -r line; do
    echo $line # 输出:exa mple
done < example

测试环境:zsh v5.9、bash v5.2.2

问题原因

这不是read命令的问题,根源在于命令替换和未加引号的变量展开:

  • 命令替换$(cat example)会将命令输出中的换行符替换为空格,同时触发shell的分词机制——按照IFS默认值(空格、制表符、换行)分割字符串,自动忽略首尾空白字符,且多个连续空白会被合并成一个。
  • 使用echo $line时,变量$line未被双引号包裹,同样会触发分词和空白合并,导致首尾空格丢失、中间多空格被合并。

解决方法

核心是始终用双引号包裹变量或命令替换结果,避免触发不必要的分词:

命令替换的正确写法

touch example
echo "  exa    mple    " >> example
echo "$(cat example)" # 输出保留所有空格:  exa    mple    
rm example

逐行读取的正确写法

touch example
echo "  exa    mple    " >> example
while IFS= read -r line; do
    echo "$line" # 输出保留所有空格:  exa    mple    
done < example
rm example

内容的提问来源于stack exchange,提问作者touka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:45:33