查看天气的核心命令:
curl "wttr.in/福州?n&lang=zh-cn"
输出福州最近三天的白天和晚上天气。(可换成你想要的城市)
问题:wttr网站连接较慢,需要时间,而且不一定能连上。
解决:后台运行脚本weather.sh,每半小时下载一次天气到日志文件,而且如果下载不成功则重复,最多重复3次。
问题:天气单词翻译不完全,有些是未翻译的英文。
解决:写perl程序transweather.pl,用正则表达式截取英文天气词组,译成中文。
问题:显示不够美观。
解决:用DispWeather输出日志文件(调用transweather.pl翻译天气),输出时修饰下。
天气显示脚本:
--------weather.sh--------
#!/bin/bash
# 通过wttr显示天气
#读取天气
#curl -s 禁止输出信息
#每半小时下载一次天气,结果写入到weather.log
LogFile=~/LOG/weather.log
while true; do
WeRes=$(curl -s --max-time 3 "wttr.in/福州?n&lang=zh-cn")
#如果成功返回,则输出文本到日志文件供查看。查看时用less -R确保能正确处理ANSI彩色
if [ $? -eq 0 ]; then
echo -e "\033[1;35m$(date)\033[0m" > $LogFile
#将天气输入到日志文件
echo -e "$WeRes" >> $LogFile
fi
sleep 30m
done
----------------
--------transweather.pl--------
#!/usr/bin/perl
#将天气文件中的英文天气翻译为中文
use strict;
use warnings;
#将每段英文天气词组翻译为中文天气,并在后面添加合适数目的空格,使长度相等
sub repl
{
my ($old_text) = @_;
my $text = $old_text;
#翻译后置的nearby
$text =~ s/^(.*) ne[a-z]*$/附近$1/;
#定义替换字符串
my @old_subs = (", ", "rain shower", "clear", "sunny", "partly ", "cloudy", "light ", "rain", "patchy ", "moderate ", "drizzle");
my @new_subs = ("转", "阵雨", "晴朗", "晴", "局部", "多云", "小", "雨", "零星小", "中", "毛毛雨");
# 替换并添加空格(认为全部替换成汉字,每个汉字长度为3,所以要/3*2,变成长度为2)
for (my $i = 0; $i < @old_subs; $i++) {
$text =~ s/$old_subs[$i]/$new_subs[$i]/ig;
}
if ($text ne $old_text) {
my $total_length_diff = length($old_text) - length($text)/3*2;
# 在末尾添加足够的空格以达到原始长度(如果有必要的话)
$text .= ' ' x ($total_length_diff > 0 ? $total_length_diff : 0);
}
return $text;
}
#从控制台读入收信信息
my $str='';
while(defined(my $line = <STDIN>)){
$str = $str . $line;
}
#unicode模式下将省略号替换为空格,以免匹配出错
$str =~ s/…/ /ug;
#搜索天气词汇并替换
$str =~ s/[A-Z,][A-Za-z ]*[a-z]/repl($&)/ge;
print $str;
----------------
--------DispWeather--------
#!/bin/bash
#显示天气
LOGFILE=~/LOG/weather.log
#显示头部
head -n 2 $LOGFILE | sed "s/:: /:\x1b[1;32m/"
#显示翻译后的天气(去掉尾部)
tail -n +3 $LOGFILE | head -n -3 | transweather.pl
----------------
在xfce4的启动执行脚本中写入:
#每半小时查看一次天气
nohup weather.sh &> /dev/null &
环境变量设置:
# less默认行为:支持ANSI彩色,搜索忽略大小写
export LESS="-i -R"
在面板中添加一项"查看天气",内容为:
bash -ic 'echo -ne "\033]0;天气\007" && DispWeather | less'
最后输出(因为用了less,所以可以按Page Up和Page Down翻页):
