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

时间:2016-04-21 20:07:04

标签: bash macos terminal grep zsh

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

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

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

IP Address:
xx.x.xx.xxx

其中" IP地址:"是红色的。我想把IP地址变成绿色,但出于某种原因,当我尝试其中任何一个时,它都不起作用:

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

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

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

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

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

然后尝试echo ${GREEN} $variable,但它仍然无效。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

[esp + 2]需要得到回应。它是一组ANSI颜色代码,终端将其识别为更改文本颜色的信号。

$GREEN

或者,浓缩:

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

另外,正如@Jens指出的那样你可以像下面这样组合grep和awk命令:

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

答案 1 :(得分:0)

正如John Kugelman's answer ${GREEN}中所述,需要打印才能生效。

当你正在运行awk时,你可以让它完成工作:

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

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

显然,引用所需的引用绝不是美丽的。需要从shell引用$2,以便awk可以识别它。不得在shell中引用${GREEN}${NC},以便shell可以替换它们。但由于它们现在只是awk的字符串,因此它们必须位于awk的双引号内;这些双引号也需要从shell中引用。

要简单地说明这一点,您可以使用awk参数在命令行上传递-v variable=value的设置变量:

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