Shell中如何让变量输出保持原有的换行格式?
如何在Bash中保留变量的换行格式输出
问题根源
当你执行echo $firstword $secondword时,Bash会对未加引号的变量做分词处理:变量里的换行符会被当作空白符(属于默认的IFS分隔符),最终所有内容被合并成一行输出,自然丢失了原有的换行格式。
解决步骤
1. 确保变量正确保留换行
提取每行字段到变量时,用命令替换($())就能保留换行符,比如从文件读取:
# 假设原内容在input.txt中 firstword=$(awk '{print $1}' input.txt) secondword=$(awk '{print $2}' input.txt)
此时firstword的值是2\n4,secondword是3\n5(\n表示换行)。
2. 按原格式输出
要让两行的字段对应输出,需要将两个变量的内容按行合并,再用带双引号的命令输出:
方法1:用paste合并行(最通用)
paste可以将多个输入的行按列合并,配合双引号展开变量:
paste <(echo "$firstword") <(echo "$secondword") | awk '{print $1 " " $2}'
执行后输出:
2 3 4 5
方法2:提前拼接成目标格式的变量
如果允许在提取时就拼接好每行内容,后续输出更简单:
result=$(awk '{print $1 " " $2}' input.txt) echo "$result"
这里的关键是给变量加双引号,echo "$result"会完整保留变量里的换行符,输出原格式。
方法3:用printf格式化输出
如果确定变量的行数固定,也可以用printf逐行输出:
printf "%s %s\n" $(echo "$firstword" | tr '\n' ' ') $(echo "$secondword" | tr '\n' ' ')
核心注意事项
- 必须用双引号包裹变量:防止Bash对变量内容做分词、路径扩展,从而保留换行、空格等格式。
- 多字段多行变量要按行合并:直接拼接变量会导致字段交叉,用
paste这类工具能保证每行字段对应。
内容的提问来源于stack exchange,提问作者GJO
相关产品推荐
相关产品推荐

