Bash中变量存储printf格式化输出后格式丢失问题求助
问题:Bash变量存储格式化输出后echo丢失列间距的原因?
环境信息
- Bash版本:4.2.46
- 操作系统:Linux 3.10.0-1160.108.1.el7
现象描述
直接执行命令时格式正常
执行以下命令:
free -h | grep Mem | awk '{printf "%-10s %-10s %-10slala\n",$2,$3,$4}'
终端输出保留了设定的10字符宽度列间距:
7.6G 2.0G 3.4G lala
存入变量后echo输出格式丢失
将命令结果存入变量后用echo输出,列间距消失:
LINE=$(free -h | grep Mem | awk '{printf "%-10s %-10s %-10s\n",$2,$3,$4}') echo $LINE
输出变为:
7.6G 2.0G 3.4G
尝试过$()、反引号、${}三种赋值方式,问题都存在。
原因解析
这是Bash的单词拆分机制导致的:
- 当你写
echo $LINE时,Bash会先把LINE变量里的所有连续空白(包括多个空格、制表符)都替换成单个空格,再把拆分后的内容传给echo,所以原来的多空格间距就被抹平了。 - 而直接执行命令时,输出内容直接送到终端显示,不会经过Bash的单词拆分步骤,所以格式能完整保留。
解决办法
给变量加上双引号,让Bash把变量内容当作一个整体处理,跳过单词拆分:
echo "$LINE"
这样就能输出带正确列间距的内容了。
内容的提问来源于stack exchange,提问作者falcon68
相关产品推荐
相关产品推荐

