在Android adb shell中运行shell脚本

时间:2014-11-11 13:12:45

标签: android bash shell adb emulation

我尝试创建一个脚本,通过adb shell从Android模拟器中查找和删除我的应用。

这就是我所拥有的:

adb shell "
cd data/app
for app in com.mycompany.*.apk;
do
    echo $app
    bundle=$(echo $app | sed 's/-[0-9]//g')
    echo 'bundle name is $bundle'
    if [ '$bundle' != '' ];then
        adb uninstall $bundle
    else
        echo 'No apps found'
    fi
done
exit
"

但它似乎没有按预期工作。

  • 我的for循环没有迭代任何东西。如果我在shell中完全按照上面的方式手动运行命令,它可以工作,但是当我从一个shellcript运行它时,for循环看不到文件或任何东西。虽然如果我添加" ls",它会正确打印文件夹的内容......所以;
  • echo $app不打印任何内容(空字符串)和;
  • echo 'bundle name is $bundle'打印bundle name is

因此,它显然永远不会进入我的if块,进入我的else子句并且那就是它。

我做错了什么?我在shell脚本方面不是很有经验,我很欣赏任何想法。

我的目标是拥有一个shell函数,我可以调用它来自动化从模拟器中删除我的应用程序的过程,而无需拖动它并手动卸载它。其他想法也非常受欢迎。

谢谢!

2 个答案:

答案 0 :(得分:1)

您不应该真正浏览/data/app文件夹。如果要使用单个adb命令卸载名称与com.mycompany模式匹配的多个包,请使用:

adb shell "pm list packages com.mycompany | cut -c9- | xargs -n 1 sh /system/bin/pm uninstall"

答案 1 :(得分:1)

  

我仍然很想知道为什么我的做法是次要的"次优的"什么   我可以做得更好吗?

狂野的猜测,因为我不熟悉adb shell而是bash:Quotation。变量不能在里面打勾' ... $ VAR'但是" ... $ VAR"。任何内部刻度都是"按照",即字面意思:

echo 'bundle name is $bundle'

VS

echo "bundle name is $bundle"