'[m' 的含义是什么以及如何在此表达式中摆脱它?

What's the meaning of '[m' and how to get rid of it in this expression?

首先简单介绍一下环境:

在我的 bash_profile 中,我声明了以下函数以快速查看我的计算机拥有的所有 IPv4:

YB=$(tput setaf 11)
WB=$(tput setaf 15)
RESET=$(tput sgr0)

lanconfig() {
  for ip in $(ifconfig | grep inet\ | cut -f 2 -d \ ); do
    echo -e "$WB LAN IP:$YB ${ip:3} $RESET"
  done
}

使用该函数一切正常,我得到以下输出:

 LAN IP: 127.0.0.1 
 LAN IP: 192.168.1.100 

其中 LAN IP: 为白色,实际 IP 地址为黄色。

现在您了解了背景,让我们假设一分钟,函数内部的 echo$ip 执行参数扩展,它只打印 var。类似于:

echo -e "$WB LAN IP:$YB $ip $RESET"

因此 echo,黄色不适用于 IP。我很震惊,我不明白。通过参数扩展进行一些测试,我发现扩展 ${ip:1} 打印出 [m127.0.0.1

问题是:

  1. [m 是什么意思?
  2. 为什么 [m 在变量中?
  3. 摆脱那个角色值得吗?怎么样?

这些是 ANSI 颜色代码。他们负责颜色和一些其他格式。 Here 您对可用的内容有一个简短的概述。基本上你可以删除这样的序列,它们纯粹是装饰性的——当然前提是你对颜色或例如粗体不感兴趣。很多人(包括我自己)都喜欢把这些东西做成脚本之类的来提高可读性。

有关详细信息,请参阅 the article in the Arch Wiki。如果您有兴趣,这是一个很好的起点。

我终于摆脱了 [m 个字符。回答我自己的问题:

  1. [m 是什么意思?

好吧,它是终端中出于美观或可读性目的使用的 ANSI 颜色代码的一部分。您可以在@neon 回答中找到更多信息。

  1. 为什么 [m 在变量中?

要找到它有点棘手,但由于循环表达式 $(ifconfig | grep inet\ | cut -f 2 -d \ ),ANSI 颜色代码作为 var 的一部分输入。我有一个 grep 的别名 grep --color=always。由于此别名,grep 始终包含匹配文本周围的 ANSI 颜色代码,因此 $ip 包含实际 IP 地址和 ANSI 颜色代码。

  1. 摆脱那个角色值得吗?怎么样?

是的,完全值得。事实上,我学到了一些新东西。别名 grep=grep --color=always 不值得,因为可能会引起这种麻烦。现在,我认为使用 grep --color=auto 更好,因此 grep 仅在输出到终端 stdout 时应用颜色。您可以在 this question.

中找到更多信息

关于“怎么做?”,我认为我的最后一段解释了这一点,但解决方案是:

将别名 grep='grep --color=always' 更改为 grep='grep --color=auto' 并删除 echo 中的参数扩展。