我正在尝试跟踪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行时它才有效;它们之间。 任何方法使这项工作多线(更容易维护)并优化它?
感谢
答案 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