Android中的BASH>使用通配符不起作用

时间:2012-07-15 21:21:58

标签: android bash notifications pattern-matching wildcard

我正在尝试跟踪Android内通知的停用。 我计划通过每隔x秒轮询通知dumpsys来做。 因为我已经将通知放入变量中,所以我可以在$ tmp变量中搜索文本(在这种情况下是google.gm),并且基于此,它会将$ Gmail设置为true或false。

当我通过PC上的Cygwin终端测试我的脚本设置时,它工作得很好,但不适用于Android

将dumpsys通知转换为$ tmp工作正常,但是当我在android上测试它(在shell中)时,似乎不想接受我的*通配符。

tmp=$(dumpsys notification)
[[ "$tmp" == *"google.gm"* ]] && Gmail=true || Gmail=false

过去两个小时我一直在网上搜索,但这有点让我发疯。 我已经完成了简化测试来调试它,它似乎真的是在通配符中

有人看到我做错了吗?

在新的建议之后,我设法做到了这一点:

tmp=$(dumpsys notification)
case $tmp in *notify_missed_call*) PRF1="1" ;; *) PRF1="0" ;; esac
case $tmp in *conv_notify*) PRF2="1" ;; *) PRF2="0" ;; esac
case $tmp in *NotYetThere*) PRF3="1" ;; *) PRF3="0" ;; esac
case $tmp in *stat_notify_calendar*) PRF4="1" ;; *) PRF4="0" ;; esac
echo $PRF1,$PRF2,$PRF3,$PRF4, > /sdcard/tmp.txt

但不知何故,只有当放入1行时它才有效;它们之间。 任何方法使这项工作多线(更容易维护)并优化它?

感谢

1 个答案:

答案 0 :(得分:0)

听起来你没有在Android上使用bash,所以请尝试使用POSIX。

case $(dumpsys notification) in 
    *google.gm*) Gmail=true ;;
    *) Gmail=false ;;
esac

<强>更新 根据您更新的答案,我看到您正在检查dumpsys notification输出中的多个值。假设这些字符串中只有一个可以出现在一行中,更好的方法是用shell或awk逐行读取它

dumpsys notification | { 
    while read -r line; do
        case $line in
            *notify_missed_call*) prf1=1;;
            *conv_notify*) prf2=1;;
            *NotYetThere*) prf3=1;;
            *stat_notify_calendar*) prf4=1;;
        esac
    done
    echo "${prf1:-0},${prf2:-0},${prf3:-0},${prf4:-0}"
} > /sdcard/tmp.txt

使用awk,您可以在同一行中检测多个值。

dumpsys notification | awk '
    /notify_missed_call/{missed=1}
    /conv_notify/{conv=1}
    /NotYetThere/{notyet=1}
    /stat_notify_calendar/{cal=1}
    END { print missed+0,conv+0,notyet+0,cal+0 }' > /sdcard/tmp.txt