Shell-Script
如何為 shell 腳本的某些輸出著色?
我寫了一個小 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
用於在終端中編寫偽圖形應用程序的模組。