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

Shell脚本输出DNS时换行异常的原因及解决咨询

问题

我编写了一个Shell脚本监控Linux主机的DNS,初始脚本如下:

#! /usr/bin/bash

NETWORKING_DNS=$(nmcli dev show |grep DNS|awk '{print $2}')
echo "Current DNS: "
echo "$NETWORKING_DNS"

执行后输出正常:

xxx@xxx ~:$ bash script.sh
Current DNS:
1.1.1.1
1.0.0.1

为了整合其他信息,我将输出改为一行:

echo "Current DNS: $NETWORKING_DNS"

但执行后输出变为:

xxx@xxx ~:$ bash script.sh
Current DNS: 1.1.1.1
1.0.0.1

预期输出应为:

Current DNS: 1.1.1.1 1.0.0.1

我尝试使用echo -n、echo -ne、printf等命令均未达到预期效果,想请教该问题的原因。我的主机信息如下:

xxx@xxx ~:$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

xxx@xxx ~:$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
原因分析

问题核心在于NETWORKING_DNS变量的内容:nmcli dev show | grep DNS | awk '{print $2}'的输出是每行一个DNS地址,因此变量中存储的内容包含换行符(\n)。当执行echo "Current DNS: $NETWORKING_DNS"时,Bash会将变量内的换行符解析为实际的换行操作,导致第二个DNS地址被单独显示在下一行。

echo -n仅取消输出末尾的换行,printf直接输出变量时也会保留原有换行符,因此这些操作都无法解决问题。

解决方法

以下几种方式可将DNS地址转换为空格分隔的单行格式:

方法1:提取阶段直接生成空格分隔内容

修改awk命令,让所有DNS地址输出在同一行,用空格分隔:

# 方式1:用printf直接输出空格分隔的内容
NETWORKING_DNS=$(nmcli dev show | grep DNS | awk '{printf "%s ", $2}')
# 方式2:用tr替换换行符为空格
NETWORKING_DNS=$(nmcli dev show | grep DNS | awk '{print $2}' | tr '\n' ' ')

之后执行echo "Current DNS: $NETWORKING_DNS"即可得到预期的单行输出。

方法2:输出时替换变量内的换行符

如果不想修改变量提取逻辑,可在输出时通过Bash参数扩展替换换行符:

echo "Current DNS: ${NETWORKING_DNS//$'\n'/ }"

方法3:用printf格式化输出

通过printf配合参数扩展实现换行符替换:

printf "Current DNS: %s\n" "${NETWORKING_DNS//$'\n'/ }"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:24:56