此处使用的正则表达式是否符合 POSIX 标准,并且使用的代码是否适合所描述的问题?

问题描述 投票:0回答:1

根据我之前的问题,请参阅下面我的问题的更完整形式。

代码用例

当前代码是一个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$
,因此隔离表情符号,
[😀]
可能不准确,因为它会匹配第一个对应的字符,从而导致不良或意外的行为。
此处
提供了对此问题的进一步解释。

regex bash shell posix emoji
1个回答
0
投票
$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

© www.soinside.com 2019 - 2024. All rights reserved.