由于一个特定的需求场景,我想写一个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"
型
它不工作。
2条答案
按热度按时间4ioopgfo1#
正如在其他答案中提到的,根本原因是
NETWORKING_DNS
中有一个换行符。您可以通过使用AWK(
print $2
)处理该变量来设置该变量的内容。有几个选项会影响AWK的输出。(您可以阅读AWK的文档以了解详细信息。)但总结如下:AWK对它从管道获得的每个记录执行print $2
-action。AWK通过打印OutputRecordSeparator(或ORS
)来分离每个操作的输出。默认情况下,
ORS
是一个换行符,但您可以将其调整为不同的内容,例如将脚本中的行替换为:字符串
将ORS改为空间。
工作原理:
-v
选项将ORS变量设置为空格,而不是默认的换行符0pizxfdo2#
为什么会发生这种
变量包含
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
。