Shell-Script

如何為 shell 腳本的某些輸出著色?

  • June 17, 2021

我寫了一個小 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

注意,有RED註釋掉。那是因為我希望生成的消息以以下任何一個開頭:

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

即不與:

  • pass

以紅色著色。

但如何做到這一點對我來說是個謎?

您可能想檢查 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

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"
}

print -P打開參數的提示擴展where %F{color}is 設置前景色%f重置它。

請注意,其中 ($color和) 中的變數的內容也會受到即時擴展(在它們可能包含字元(或如果啟用該選項時更多)$ip的情況下要記住這一點)和轉義序列(如上)擴展.%``promptsubst``\n

其他訪問顏色的方法zsh

  • colors自動載入功能:
 autoload colors; colors
 echo $fg[green]text$reset_color
  • 參數擴展標誌,它可以對%變數的內容進行快速擴展:
 var='%F{green}' reset=%f
 echo ${(%)var}text${(%)reset}

也可以看看:

   echo ${(%):-%F{green}}text${(%):-%f}

或更好

   printf '%s\n' "${(%):-%F{green}}$text${(%):-%f}"

保證內容按$text原樣輸出。

  • zsh/curses用於在終端中編寫偽圖形應用程序的模組。

引用自:https://unix.stackexchange.com/questions/408867