【问题标题】:How to define a series of bash commands as a string?如何将一系列 bash 命令定义为字符串?
【发布时间】:2016-08-15 05:38:11
【问题描述】:

现在我的 .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,但还是不行。

有什么想法吗?

【问题讨论】:

  • 你知道 grep|awk 是一个愚蠢的反模式吗? awk 可以做 grepping:ifconfig en0 | awk '/inet / {print $1}'。节省昂贵的叉子和管子。

标签: bash macos terminal grep zsh


【解决方案1】:

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

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

或者,浓缩:

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

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

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

【讨论】:

    【解决方案2】:

    正如John Kugelman's answer 中已经指出的,${GREEN} 需要打印才能生效。

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

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

    这允许更多地控制要着色的内容,尤其是对于更复杂的awk 程序。

    显然,为此所需要的引用绝非优美。 $2需要从shell中引用,这样才能被awk识别。 ${GREEN}${NC} 一定不能从 shell 中引用,以便它们可以被 shell 替换。但由于它们现在只是awk 的字符串,因此它们需要在awk 的双引号内;这些双引号也需要从shell中引用。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-06
      • 2011-02-20
      • 2016-05-19
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多