效果如圖:

創建腳本,並賦可執行權限:

~/.i3/myi3status.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
# shell script to prepend i3status with more stuff
STOCK_SCRIPT=`realpath "$0"|xargs dirname`/stock.php
i3status | while :
do
stock_info=""
if [[ -x "$STOCK_SCRIPT" ]]; then
stock_info=`$STOCK_SCRIPT`
fi
read line
# if output_format = i3bar in i3status.conf
stock_info="[{ \"full_text\": \"${stock_info}\" },"
echo "${line/[/$stock_info}" || exit 1
# # if not output_format = i3bar in i3status.conf
# echo "$stock_info | $line" || exit 1
done

如果i3status.conf中啟用了JSON格式輸出(支持顏色),應啟用上面腳本中第一塊的代碼,否則使用後面的。啟動JSON格式輸出的內容具體如下:

~/.i3status.conf
1
2
3
4
general {
colors = true
output_format = i3bar
}

在i3wm的配置文件中用以上腳本替換i3status:

~/.i3/config
1
2
3
4
5
6
7
8
9
10
bar {
# ...
# status_command i3status
status_command ~/.i3/myi3status.sh
# ...
}

在和上面腳本同路徑下創建腳本:

~/.i3/stock.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/env php
<?php
class PinYin
{
public static function utf8To($ss, $isfirst = false)
{
return self::convert(self::utf8ToGB2312($ss), $isfirst);
}
public static function utf8ToGB2312($ss)
{
return iconv('UTF-8', 'GB2312//IGNORE', $ss);
}
// 字符串必须为GB2312编码
public static function convert($ss, $isfirst = false)
{
$res = '';
$len = strlen($ss);
$pinyinArr = self::get_pinyin_array();
for ($i=0; $i<$len; $i++) {
$ascii = ord($ss[$i]);
if ($ascii > 0x80) {
$asciiB = ord($ss[++$i]);
$ascii = $ascii * 256 + $asciiB - 65536;
}
if ($ascii < 255 && $ascii > 0) {
if (($ascii >= 48 && $ascii <= 57) || ($ascii >= 97 && $ascii <= 122)) {
$res .= $ss[$i]; // 0-9 a-z
} elseif ($ascii >= 65 && $ascii <= 90) {
$res .= strtolower($ss[$i]); // A-Z
} else {
$res .= '_';
}
} elseif ($ascii < -20319 || $ascii > -10247) {
$res .= '_';
} else {
foreach ($pinyinArr as $py=>$asc) {
if ($asc <= $ascii) {
$res .= $isfirst ? $py[0] : $py;
break;
}
}
}
}
return $res;
}
public static function toFirst($ss)
{
$ascii = ord($ss[0]);
if ($ascii > 0xE0) {
$ss = self::utf8ToGB2312($ss[0].$ss[1].$ss[2]);
} elseif ($ascii < 0x80) {
if ($ascii >= 65 && $ascii <= 90) {
return strtolower($ss[0]);
} elseif ($ascii >= 97 && $ascii <= 122) {
return $ss[0];
} else {
return false;
}
}
if (strlen($ss) < 2) {
return false;
}
$asc = ord($ss[0]) * 256 + ord($ss[1]) - 65536;
if($asc>=-20319 && $asc<=-20284) return 'a';
if($asc>=-20283 && $asc<=-19776) return 'b';
if($asc>=-19775 && $asc<=-19219) return 'c';
if($asc>=-19218 && $asc<=-18711) return 'd';
if($asc>=-18710 && $asc<=-18527) return 'e';
if($asc>=-18526 && $asc<=-18240) return 'f';
if($asc>=-18239 && $asc<=-17923) return 'g';
if($asc>=-17922 && $asc<=-17418) return 'h';
if($asc>=-17417 && $asc<=-16475) return 'j';
if($asc>=-16474 && $asc<=-16213) return 'k';
if($asc>=-16212 && $asc<=-15641) return 'l';
if($asc>=-15640 && $asc<=-15166) return 'm';
if($asc>=-15165 && $asc<=-14923) return 'n';
if($asc>=-14922 && $asc<=-14915) return 'o';
if($asc>=-14914 && $asc<=-14631) return 'p';
if($asc>=-14630 && $asc<=-14150) return 'q';
if($asc>=-14149 && $asc<=-14091) return 'r';
if($asc>=-14090 && $asc<=-13319) return 's';
if($asc>=-13318 && $asc<=-12839) return 't';
if($asc>=-12838 && $asc<=-12557) return 'w';
if($asc>=-12556 && $asc<=-11848) return 'x';
if($asc>=-11847 && $asc<=-11056) return 'y';
if($asc>=-11055 && $asc<=-10247) return 'z';
return false;
}
public static function get_pinyin_array()
{
static $pyArr;
if(isset($pyArr)) return $pyArr;
$kk = 'a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|bin|bing|bo|bu|ca|cai|can|cang|cao|ce|ceng|cha|chai|chan|chang|chao|che|chen|cheng|chi|chong|chou|chu|chuai|chuan|chuang|chui|chun|chuo|ci|cong|cou|cu|cuan|cui|cun|cuo|da|dai|dan|dang|dao|de|deng|di|dian|diao|die|ding|diu|dong|dou|du|duan|dui|dun|duo|e|en|er|fa|fan|fang|fei|fen|feng|fo|fou|fu|ga|gai|gan|gang|gao|ge|gei|gen|geng|gong|gou|gu|gua|guai|guan|guang|gui|gun|guo|ha|hai|han|hang|hao|he|hei|hen|heng|hong|hou|hu|hua|huai|huan|huang|hui|hun|huo|ji|jia|jian|jiang|jiao|jie|jin|jing|jiong|jiu|ju|juan|jue|jun|ka|kai|kan|kang|kao|ke|ken|keng|kong|kou|ku|kua|kuai|kuan|kuang|kui|kun|kuo|la|lai|lan|lang|lao|le|lei|leng|li|lia|lian|liang|liao|lie|lin|ling|liu|long|lou|lu|lv|luan|lue|lun|luo|ma|mai|man|mang|mao|me|mei|men|meng|mi|mian|miao|mie|min|ming|miu|mo|mou|mu|na|nai|nan|nang|nao|ne|nei|nen|neng|ni|nian|niang|niao|nie|nin|ning|niu|nong|nu|nv|nuan|nue|nuo|o|ou|pa|pai|pan|pang|pao|pei|pen|peng|pi|pian|piao|pie|pin|ping|po|pu|qi|qia|qian|qiang|qiao|qie|qin|qing|qiong|qiu|qu|quan|que|qun|ran|rang|rao|re|ren|reng|ri|rong|rou|ru|ruan|rui|run|ruo|sa|sai|san|sang|sao|se|sen|seng|sha|shai|shan|shang|shao|she|shen|sheng|shi|shou|shu|shua|shuai|shuan|shuang|shui|shun|shuo|si|song|sou|su|suan|sui|sun|suo|ta|tai|tan|tang|tao|te|teng|ti|tian|tiao|tie|ting|tong|tou|tu|tuan|tui|tun|tuo|wa|wai|wan|wang|wei|wen|weng|wo|wu|xi|xia|xian|xiang|xiao|xie|xin|xing|xiong|xiu|xu|xuan|xue|xun|ya|yan|yang|yao|ye|yi|yin|ying|yo|yong|you|yu|yuan|yue|yun|za|zai|zan|zang|zao|ze|zei|zen|zeng|zha|zhai|zhan|zhang|zhao|zhe|zhen|zheng|zhi|zhong|zhou|zhu|zhua|zhuai|zhuan|zhuang|zhui|zhun|zhuo|zi|zong|zou|zu|zuan|zui|zun|zuo';
$vv = '-20319|-20317|-20304|-20295|-20292|-20283|-20265|-20257|-20242|-20230|-20051|-20036|-20032|-20026|-20002|-19990|-19986|-19982|-19976|-19805|-19784|-19775|-19774|-19763|-19756|-19751|-19746|-19741|-19739|-19728|-19725|-19715|-19540|-19531|-19525|-19515|-19500|-19484|-19479|-19467|-19289|-19288|-19281|-19275|-19270|-19263|-19261|-19249|-19243|-19242|-19238|-19235|-19227|-19224|-19218|-19212|-19038|-19023|-19018|-19006|-19003|-18996|-18977|-18961|-18952|-18783|-18774|-18773|-18763|-18756|-18741|-18735|-18731|-18722|-18710|-18697|-18696|-18526|-18518|-18501|-18490|-18478|-18463|-18448|-18447|-18446|-18239|-18237|-18231|-18220|-18211|-18201|-18184|-18183|-18181|-18012|-17997|-17988|-17970|-17964|-17961|-17950|-17947|-17931|-17928|-17922|-17759|-17752|-17733|-17730|-17721|-17703|-17701|-17697|-17692|-17683|-17676|-17496|-17487|-17482|-17468|-17454|-17433|-17427|-17417|-17202|-17185|-16983|-16970|-16942|-16915|-16733|-16708|-16706|-16689|-16664|-16657|-16647|-16474|-16470|-16465|-16459|-16452|-16448|-16433|-16429|-16427|-16423|-16419|-16412|-16407|-16403|-16401|-16393|-16220|-16216|-16212|-16205|-16202|-16187|-16180|-16171|-16169|-16158|-16155|-15959|-15958|-15944|-15933|-15920|-15915|-15903|-15889|-15878|-15707|-15701|-15681|-15667|-15661|-15659|-15652|-15640|-15631|-15625|-15454|-15448|-15436|-15435|-15419|-15416|-15408|-15394|-15385|-15377|-15375|-15369|-15363|-15362|-15183|-15180|-15165|-15158|-15153|-15150|-15149|-15144|-15143|-15141|-15140|-15139|-15128|-15121|-15119|-15117|-15110|-15109|-14941|-14937|-14933|-14930|-14929|-14928|-14926|-14922|-14921|-14914|-14908|-14902|-14894|-14889|-14882|-14873|-14871|-14857|-14678|-14674|-14670|-14668|-14663|-14654|-14645|-14630|-14594|-14429|-14407|-14399|-14384|-14379|-14368|-14355|-14353|-14345|-14170|-14159|-14151|-14149|-14145|-14140|-14137|-14135|-14125|-14123|-14122|-14112|-14109|-14099|-14097|-14094|-14092|-14090|-14087|-14083|-13917|-13914|-13910|-13907|-13906|-13905|-13896|-13894|-13878|-13870|-13859|-13847|-13831|-13658|-13611|-13601|-13406|-13404|-13400|-13398|-13395|-13391|-13387|-13383|-13367|-13359|-13356|-13343|-13340|-13329|-13326|-13318|-13147|-13138|-13120|-13107|-13096|-13095|-13091|-13076|-13068|-13063|-13060|-12888|-12875|-12871|-12860|-12858|-12852|-12849|-12838|-12831|-12829|-12812|-12802|-12607|-12597|-12594|-12585|-12556|-12359|-12346|-12320|-12300|-12120|-12099|-12089|-12074|-12067|-12058|-12039|-11867|-11861|-11847|-11831|-11798|-11781|-11604|-11589|-11536|-11358|-11340|-11339|-11324|-11303|-11097|-11077|-11067|-11055|-11052|-11045|-11041|-11038|-11024|-11020|-11019|-11018|-11014|-10838|-10832|-10815|-10800|-10790|-10780|-10764|-10587|-10544|-10533|-10519|-10331|-10329|-10328|-10322|-10315|-10309|-10307|-10296|-10281|-10274|-10270|-10262|-10260|-10256|-10254';
$key = explode('|', $kk);
$val = explode('|', $vv);
$pyArr = array_combine($key, $val);
arsort($pyArr);
return $pyArr;
}
}
define('STOCKS_FILE', $_SERVER['HOME'].'/.stocks');
if (!file_exists(STOCKS_FILE)) {
exit('File not found: '.STOCKS_FILE);
}
$stockCodeArr = explode("\n", trim(file_get_contents(STOCKS_FILE)));
if (empty($stockCodeArr)) {
exit('No stock code found.');
}
$context = stream_context_create(
[
'http'=>[
'method'=>"GET",
'timeout' => 3
]
]
);
$response = file_get_contents("http://hq.sinajs.cn/list=".implode(',', $stockCodeArr), false, $context);
if (empty($response)) {
exit('Failed fetching stock info with API.');
}
$result = [];
$lines = explode("\n", trim(iconv('gbk', 'utf-8', $response)));
foreach ($lines as $line) {
$matches = [];
preg_match('/".*"/', $line, $matches);
if (!empty($matches)) {
$stock = explode(',', trim($matches[0], '"'));
if (!empty($stock)) {
$result[] = strtoupper(PinYin::utf8To($stock[0], true)).": {$stock[3]}, {$stock[4]}, {$stock[5]}";
}
}
}
echo implode('; ', $result);

腳本從~/.stocks中讀取股票代碼:

~/.stocks
1
2
sh601985
sz002024