linux 我遇到了一个奇怪的Shell问题,我无法理解

7xzttuei  于 9个月前  发布在  Linux
关注(0)|答案(2)|浏览(79)

由于一个特定的需求场景,我想写一个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"


它不工作。

4ioopgfo

4ioopgfo1#

正如在其他答案中提到的,根本原因是NETWORKING_DNS中有一个换行符。
您可以通过使用AWK(print $2)处理该变量来设置该变量的内容。有几个选项会影响AWK的输出。(您可以阅读AWK的文档以了解详细信息。)但总结如下:AWK对它从管道获得的每个记录执行print $2-action。AWK通过打印OutputRecordSeparator(或ORS)来分离每个操作的输出。
默认情况下,ORS是一个换行符,但您可以将其调整为不同的内容,例如将脚本中的行替换为:

NETWORKING_DNS=$(nmcli dev show |grep DNS|awk -v ORS=" " '{print $2}')

字符串
将ORS改为空间。
工作原理:

  • awk的调用使用-v选项将ORS变量设置为空格,而不是默认的换行符
0pizxfdo

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 trman paste

相关问题