如何为 shell 脚本的某些输出着色?

Lin*_*eak 7 colors shell-script

我写了一个小 Bash 脚本,spfquery用于检查我的域电子邮件 SPF 记录,如果它传递所有提供商的 IP 地址:

#!/bin/bash

# RED="\033[1;31m"
GREEN="\033[1;32m"
NOCOLOR="\033[0m"

email="[my email address]" # deleted for bots not to hound me

declare -a ips=("88.86.120.212" "88.86.120.223" "88.86.120.250" "88.86.120.213" "88.86.120.103" "46.234.104.23" "46.234.104.24")

echo -e "\n\n"

for ip in "${ips[@]}"
do
    echo -e "${GREEN}$ip${NOCOLOR}"
    spfquery -sender $email -ip $ip -helo kolbaba.stable.cz
    echo -e "\n\n"
done
Run Code Online (Sandbox Code Playgroud)

注意,有RED注释掉。那是因为我希望生成的消息以以下任何一个开头:

  • fail
  • softfail
  • neutral
  • unknown
  • error
  • none

即不与:

  • pass

以红色着色。

但如何做到这一点对我来说是个谜?

Sté*_*las 10

zsh代替bash

#!/bin/zsh

email="info@vlastimilburian.cz"

ips=(88.86.120.{212,223,250,213,103} 46.234.104.{23,24})

print '\n\n'

for ip ($ips) {
  spfquery -sender $email -ip $ip -helo kolbaba.stable.cz &&
    color=green || color=red

  print -P "%F{$color}$ip%f\n"
}
Run Code Online (Sandbox Code Playgroud)

print -P打开参数的提示扩展where %F{color}is to set theforeground color, and %freset it.

请注意,其中 ($color$ip) 中变量的内容也受到提示扩展(在它们可能包含%字符(或更多,如果promptsubst启用该选项)的情况下要记住的事情)和转义序列(\n如上)扩展.

其他访问颜色的方法zsh

也可以看看:

    echo ${(%):-%F{green}}text${(%):-%f}
Run Code Online (Sandbox Code Playgroud)

或更好

    printf '%s\n' "${(%):-%F{green}}$text${(%):-%f}"
Run Code Online (Sandbox Code Playgroud)

以保证$text原样输出的内容。

  • zsh/curses模块用来在终端写入伪图形应用程序。


Jas*_*ush 8

您可能想要检查 spfquery 的退出代码,然后使用 if/else 来查看它是否通过。像这样的东西:

#!/bin/bash

RED="\033[1;31m"
GREEN="\033[1;32m"
NOCOLOR="\033[0m"

email="info@vlastimilburian.cz"

declare -a ips=("88.86.120.212" "88.86.120.223" "88.86.120.250" "88.86.120.213" "88.86.120.103" "46.234.104.23" "46.234.104.24")

echo -e "\n\n"

for ip in "${ips[@]}"
do
    spfquery -sender $email -ip $ip -helo kolbaba.stable.cz

    exit_status=$?
    if [ $exit_status -eq 0 ]; then
        echo -e "${GREEN}$ip${NOCOLOR}"
    else
        echo -e "${RED}$ip${NOCOLOR}"
    fi

    echo -e "\n\n"
done
Run Code Online (Sandbox Code Playgroud)