由于特定的需求场景,我想编写一个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
我不知道为什么会发生这种情况。 我尝试了很多方法,例如使用 -n 选项:
echo -n "Current DNS: $NETWORKING_DNS"
或者
printf "Current DNS: %s" "$NETWORKING_DNS"
他们都没有达到我想要的结果。
谁能告诉我这是为什么? (这是一个“不重要”的问题,但我有点好奇。)
我的Linux主机信息:
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.
echo -n "Current DNS: $NETWORKING_DNS"
或
echo -ne "Current DNS: $NETWORKING_DNS"
或
printf "Current DNS: %s" "$NETWORKING_DNS"
不起作用。
为什么会发生这种情况
变量包含
1.1.1.1
,后跟换行符,后跟 1.0.0.1
。
打印时换行符开始新行。将光标位置前进到下一个空行,可以选择将终端输出向上移动一行(具体取决于终端),并将光标位置移动到第 0 列。
变量包含换行符,无论用什么方法打印变量内容时都会打印该换行符。
提示:您可以使用
declare -p NETWORKING_DNS
调试变量。不带引号的变量扩展会经历单词分割(和文件名扩展),它将由空格分割的单词连接起来 - 所以你可能会echo $NETWORKING_DNS
。研究 ASCII、shell 引用、分词扩展、文件名扩展。使用 shellcheck 检查您的脚本。要将换行符替换为空格,只需使用 tr ' ' '\n'
或 paste -sd ' '
,请参阅 man tr
和 man paste
。