我正在尝试使用curl 制作一个“加密货币新闻”脚本,到目前为止它可以工作,但并不完全按照我的预期方式。
这是脚本主要部分的代码:
curl -s https://www.coindesk.com/ \
| grep '<h3>\|datetime\|<p>' \
| sed "s/<h3>//;" \
| sed 's/timeauthor">//;' \
| cut -d '>' -f2 | cut -d '<' -f1 \
| head -46 \
| tail -39 \
| sed '3G;6G;9G;12G;15G;18G;21G;24G;27G;30G;33G;36G;39G'
我正在尝试为包含标题和时间的行添加颜色,这样会更容易阅读。事实证明这很困难。
首先我创建了颜色变量,如下所示:
n=`echo -en "\e[0m"`
b=`echo -en "\e[1m"`
r=`echo -en "\e[31m"`
a=`echo -en "\e[36m"`
我尝试通过几种方式将它们添加到脚本中,但到目前为止还没有成功。
这是一个例子:
sed "s/<h3>/`echo "${r}${b}`/;" | sed 's/timeauthor">/`echo "${a}`/;'
我什至无法显示颜色。另一个问题是,即使我可以,我也不确定如何添加 ${n} 变量以使文本再次恢复正常......
脚本的整个“工作”版本:
#!/bin/bash
# Color variables
n=`echo -en "\e[0m"`
b=`echo -en "\e[1m"`
r=`echo -en "\e[31m"`
a=`echo -en "\e[36m"`
# Prints news from coindesk.com
curl -s https://www.coindesk.com/ | grep '<h3>\|datetime\|<p>' | sed "s/<h3>//;" | sed 's/timeauthor">//;' | cut -d '>' -f2 | cut -d '<' -f1 | head -46 | tail -39 | sed '3G;6G;9G;12G;15G;18G;21G;24G;27G;30G;33G;36G;39G'
我对 Linux 相当陌生,一周前的今天开始编写 bash 脚本,所以这甚至可能不是完成我想要做的事情的最佳解决方案。甚至连工作部件也显得“过于复杂”并且有点拼凑在一起。特别是头部/尾部部分,但这是我能想到的最好的。
答案1
简短而简单的答案
用于tput setaf $COLOUR_CODE
生成彩色输出。替换为和$COLOUR_CODE
之间的整数,属于 8 种基本颜色(分别映射到序列to )。1
8
\e[31m
\e[38m
所以对于你的脚本来说:
# Color variables
n=`tput sgr0`
b=`tput bold`
r=`tput setaf 1`
a=`tput setaf 6`
更详细的解释
首先,永远不要使用echo
来输出转义序列,例如"\e[31m"
。该命令是便携式火车残骸,并且其-n -e
开关并未得到普遍支持。改用printf
:
printf '\e[31m'
这也适用于其他 C 风格的转义,例如\n
和\t
:
# Using Bash (Linux)
$ echo "foo\nbar"
foo\nbar
# Using Ksh (*BSD)
$ echo "foo\nbar"
foo
bar
其次,硬编码 ANSI 转义码并不是生成彩色输出的最佳方法。这tput(1)
为此目的而存在命令:
tput setaf 2 # Generates green text
tput bold # Generate bold text
tput sgr0 # Reset those fancy effects
# To use them as variables:
bold=$(tput bold)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo "${bold}HEADING${reset}"
第三,重要的是要了解彩色终端输出在系统、终端仿真器或硬件之间并不通用。tput
在某些情况下甚至可能不可用,并且依靠突出显示来使 TTY 文本可读是不好的做法。