如何将一系列 bash 命令定义为字符串?

How to define a series of bash commands as a string?

现在我的 .zshrc 文件中的一些代码如下所示:

inetFunction(){
    echo ${LRED}IP Address:${NC}
    ifconfig en0 | grep "inet " | awk '{print }'
}

$LRED 定义为将颜色更改为浅红色,$NC 将其设置回正常。我用代码 alias inet='inetFunction' 实现了 inetFunction。命令的输出是

IP Address:
xx.x.xx.xxx

其中 "IP Address:" 为红色。我想将 IP 地址设为绿色,但出于某种原因,当我尝试其中任何一个时,它都不起作用:

${GREEN}ifconfig en0 | grep "inet " | awk '{print }'

ifconfig en0 | grep "inet " | ${GREEN}awk '{print }'

${GREEN}ifconfig en0 | grep "inet " | awk '{${GREEN} print }'

我什至尝试将整个事情设置为一个变量,例如:

variable='ifconfig en0 | grep "inet " | awk '{print }''

然后尝试echo ${GREEN} $variable,但还是不行。

有什么想法吗?

$GREEN 需要回显。这是一组 ANSI 颜色代码,您的终端将其识别为更改文本颜色的信号。

echo -n "$GREEN"
ifconfig en0 | grep "inet " | awk '{print }'
echo -n "$NC"

或者,浓缩:

echo "$GREEN$(ifconfig en0 | grep "inet " | awk '{print }')$NC"

此外,正如@Jens 指出的那样,您可以像这样组合 grep 和 awk 命令:

echo "$GREEN$(ifconfig en0 | awk '/inet / {print }')$NC"

中所述${GREEN}需要打印才能生效。

因为你是 运行 awk 无论如何,你可以让它完成工作:

ifconfig en0 | awk '/inet / {print "'${GREEN}'"  "'${NC}'"}'
ifconfig eno1 | awk "/inet / {print \"${GREEN}\" $2 \"${NC}\"}"   

这样可以更好地控制要着色的内容,尤其是对于更复杂的 awk 程序。

显然,为此所需的引述一点也不漂亮。 </code>需要从shell中引用,这样才能被<code>awk识别。 ${GREEN}${NC} 不能从 shell 中引用,以便它们可以被 shell 替换。但是因为它们现在只是 awk 的字符串,所以它们需要放在 awk 的双引号内;这些双引号也需要从 shell.

中引用

为了简单起见,您可以在命令行上使用 -v variable=value 参数为 awk 传递设置变量:

ifconfig en0 | awk -v green="$GREEN" -v nc="$NC" '/inet / {print green  nc}'