当前位置: 首页 > 知识库问答 >
问题:

为什么ADB命令会破坏bash脚本循环?

丰景同
2023-03-14

我注意到一个问题,当从shell脚本循环运行多个adb命令时,大多数命令都不会执行。

这是一个示例脚本。

脚本名称:adbscript。sh

#!/bin/bash

devicecount=0
while read device; do
    ((devicecount++))
    serialno="NA"
    appinstallcount="NA"
    echo "Processing Device #$devicecount: $device"
    # serialno=$(adb -s $device shell getprop ro.serialno)
    # appinstallcount=$(adb -s $device shell pm list packages | wc -l)
    echo -e "Device: $device | Serialno: $serialno | Apps installed: $appinstallcount\n"
done < <(adb devices | egrep "\bdevice\b" | awk '{print $1}')
echo "Finished."

注释掉adb命令的输出

我连接了5台设备。在不使用theadab命令的情况下从bash文件运行时,这是输出。它遍历5个循环中的每一个。

Processing Device #1: 192.168.15.93:5123
Device: 192.168.15.93:5123 | Serialno: NA | Apps installed: NA

Processing Device #2: 192.168.15.95:5123
Device: 192.168.15.95:5123 | Serialno: NA | Apps installed: NA

Processing Device #3: emulator-5554
Device: emulator-5554 | Serialno: NA | Apps installed: NA

Processing Device #4: 31005c77c8cfb200
Device: 31005c77c8cfb200 | Serialno: NA | Apps installed: NA

Processing Device #5: 98883837594d4f5453
Device: 98883837594d4f5453 | Serialno: NA | Apps installed: NA

Finished.

包含ADB命令的循环输出

当取消注释adb shell命令时,它只会正确地迭代第一个循环的行。这是未注释adb命令时的输出:

Processing Device #1: 192.168.15.93:5123
Device: 192.168.15.93:5123 | Serialno: 98883837594d4f5453 | Apps installed: 442

Finished.

有人能解释一下这种行为吗?要处理所有的行和循环需要做些什么?

顺便说一下,这是提供给脚本的输出(一个线性命令和输出):

$ adb devices | egrep "\bdevice\b" | awk '{print $1}'
192.168.15.93:5123
192.168.15.95:5123
emulator-5554
31005c77c8cfb200
98883837594d4f5453

共有2个答案

米承嗣
2023-03-14

虽然@chrisdod的根本原因分析是正确的,并且他的解决方案总体上运行良好,但对于adb自动化目的,最好使用adb exec-out而不是建议的adb

还有,当您已经在使用awk时,为什么还要使用grep?

for device in $(adb devices | awk '$2=="device"{print$1}')
do
    serialno=$(adb -s $device exec-out getprop ro.serialno)
    appinstallcount=$(adb -s $device exec-out pm list packages | wc -l)
    ...
done

要使adb exec out正常工作,您需要您的主机PC和设备都具有最新的adb版本(如果是设备,则为adbd版本),平台工具v24和Android 5.1应该可以。

弘和同
2023-03-14

adb外壳将stdin连接到设备上运行的命令,该命令通常会使用stdin,直到达到EOF。因此,这些命令会使用所有其余的设备名称,导致循环退出。

使用stdin重定向运行adb,因此它们可以立即获得EOF,而不会干扰您尝试循环的内容:

serialno=$(adb </dev/null -s $device shell getprop ro.serialno)
appinstallcount=$(adb </dev/null -s $device shell pm list packages | wc -l)
 类似资料:
  • 我有一个简单的bash脚本,它在设备列表中迭代,并对Android设备运行adb shell命令。代码如下: 运行时,代码将在一个设备上成功运行所有配置。插入两个设备时,输出读数如下:

  • 问题内容: 我正在尝试使用命令记录bash会话。 该命令是从bash脚本开始执行的,但是一旦执行,bash脚本就会终止。 我尝试使用各种组合来始终以相同的结果调用命令(调用该命令后立即终止bash脚本)。我得到的输出如下: 我也尝试过最后用a来调用命令,但是再次失败了。 谁能告诉我如何从bash脚本调用命令? 谢谢 问题答案: 您的Shell脚本没有终止。它仍在运行。您会收到提示,因为正在生成新的

  • 这是我的密码: 将按如下方式生成: 都很好。一切都被包装成标签。 现在我需要将这一行添加到上面的代码中: 下面是生成的代码: 但令人惊讶的是,它将被错误地生成: 看到没?元素跳出了标记。我怎么能把所有的东西都放在里面?

  • 问题内容: 实际上,我已经找到导致问题的原因。我的问题是为什么现在加入到你的断? 原始问题 对我来说,最简单的CSS任务似乎失败了:不保持元素相对于视点的位置。考虑以下样式表: 首次加载页面时,定位正确。但是,视口的任何更改(例如滚动或调整大小)都不会影响元素的位置。可以这么说,它无法使其位置适应新的视口。 足够奇怪的是,该站点显示了如何工作,实际上在我的浏览器中正常工作,没有任何问题! 因此,问

  • 我已经写了一个脚本,在我的Ubuntu发行版上作为自动点击器工作。点击工作,但'sleep‘命令似乎不能正常工作。如果我取出click并从terminal运行它,那么sleeps将按预期工作。但是当我将它绑定到一个快捷方式并且在玩游戏的时候运行它的时候,它并没有Hibernate,看起来它只是一直点击。 最重要的Hibernate是break_intervalHibernate,因为它将高压灭菌器

  • 我正在编写一个bin bash shell脚本来一次从多个设备收集信息。但是我注意到,如果在while循环中执行任何adb命令,都会破坏它。不知道为什么,因为循环显然没有完成。我知道有很多关于这个话题的讨论,但是我找不到类似的问题。任何建议都会有帮助。谢谢你。