从
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台设备.当从没有theadb命令的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
adb shell将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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。