根据我之前的问题,请参阅下面我的问题的更完整形式。
当前代码是一个module,用于可定制的状态栏polybar。根据第一个链接,polybar 是使用配置文件绘制的,每个被调用的 bar(例如通过运行
polybar mybar
)都会读取任何给定模块的配置文件。完整的示例可以参见here。通过调用相关脚本文件来加载自定义或用户定义的模块。例如:
[module/test]
type = custom/script
exec = some/script/file
tail = true
Polybar 至少接受 shell 脚本和 python 脚本(也许还有其他脚本,尽管我还没有测试过)。出于这个问题的目的,我关心我的 shell 脚本的适当性,以及not它与polybar的接口(目前按预期工作;尽管@EdMortonexplains,这可能不是预期的功能,因此这个问题).
以下是我的代码的最小工作示例。
#!/bin/bash
smile=#d1dadf;
sad=#ff5833;
angry=#1a88a4;
laugh=#daf7a6;
while true; do
# get hour
time=$(date +%_H -u);
# set empty hour
timeShow=TEST;
# set empty emoji
emoji=;
if [ $time -ge 0 ] && [ $time -lt 6 ];
then
emoji=%{F$smile}😀%{F-}
elif [ $time -ge 6 ] && [ $time -lt 12 ];
then
emoji=%{F$sad}😢%{F-}
elif [ $time -ge 12 ] && [ $time -lt 18 ];
then
emoji=%{F$angry}😡%{F-}
elif [ $time -ge 18 ] && [ $time -ne 0 ];
then
emoji=%{F$laugh}😆%{F-}
fi
if [[ "$emoji" =~ [😢] ]];
then
((timeShow = time - 1))
elif [[ "$emoji" =~ [😡] ]];
then
((timeShow = time - 2))
elif [[ "$emoji" =~ [😆] ]];
then
((timeShow = time - 3))
fi
echo "$timeShow:$(date '+%M' -u) $emoji"
sleep 1 &
wait
done
按原样运行脚本不需要输入(输出是从脚本本身内部计算的)。因此运行脚本只需通过:
./script.sh
输出应该(并且确实)返回格式化的时间,以及用颜色格式标签包裹的表情符号,如上所述。示例输出,假设运行时的 UTC 时间为上午 8 点:
7:00 %{F#ff5833}😢%{F-}
该程序目前采用从
date
开始的当前 UTC 小时。然后修改该值(存储在变量 time
中)并将其存储在 timeShow
中。假设特定的小时范围(因此为 emoji
),脚本然后通过减去 1、2 或 3 来修改 timeShow
。通过执行正则表达式操作来定位字符,可以在字符串 emoji
中找到表情符号,由颜色格式包裹。
脚本按预期工作。然而,如上所述,这可能并非偶然。这个问题的目的是了解所使用的方法是否产生了正确的输出,或者只是“发生”了。目前,正则表达式通过使用 [😀]
来隔离 字符。对于任何可能包含 2 个或更多字符的字形,例如
M-bM-^XM-^A$
,因此隔离表情符号,[😀]
可能不准确,因为它会匹配第一个对应的字符,从而导致不良或意外的行为。 此处提供了对此问题的进一步解释。
$emoji
与正则表达式匹配,而是在设置
emoji
时设置另一个变量,并在设置 timeShow
时使用该变量。#!/bin/bash
smile=#d1dadf;
sad=#ff5833;
angry=#1a88a4;
laugh=#daf7a6;
while true; do
# get hour
time=$(date +%_H -u);
# set empty hour
timeShow=TEST;
timeOffset=0
# set empty emoji
emoji=;
if [ $time -ge 0 ] && [ $time -lt 6 ];
then
emoji=%{F$smile}😀%{F-}
timeOffset=3
elif [ $time -ge 6 ] && [ $time -lt 12 ];
then
emoji=%{F$sad}😢%{F-}
timeOffset=1
elif [ $time -ge 12 ] && [ $time -lt 18 ];
then
emoji=%{F$angry}😡%{F-}
timeOffset=2
elif [ $time -ge 18 ] && [ $time -ne 0 ];
then
emoji=%{F$laugh}😆%{F-}
timeOffset=3
fi
timeshow=$((time - timeOffset)
echo "$timeShow:$(date '+%M' -u) $emoji"
sleep 1 &
wait
done