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
相关产品推荐
相关产品推荐

