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

问题描述 投票:0回答:1

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

不起作用。

linux shell sh
1个回答
0
投票

为什么会发生这种情况

变量包含

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

© www.soinside.com 2019 - 2024. All rights reserved.