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

运行adb命令的Shell脚本中断了while循环[重复]

邬友樵
2023-03-14

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

#!/bin/bash
echo "# Collecting attached devices under adb and record the project name..."
adb devices | while read line
do

   if  [ "$line" != "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
then

device_sn=`echo $line | awk '{print $1}'`

project_name=`adb -s $device_sn shell getprop ro.product.device` #This line will break the while loop. If I remove it I can have all connected devices reboot to bootloader

echo "$project_name: $device_sn is rebooting to bootloader"

adb -s $device_sn reboot bootloader

   fi
done

共有1个答案

严亮
2023-03-14

我在这里猜测,但可能是adb命令正在读取读取在读取时预期的输入。这是 while read 类型循环的一个相当常见的问题,并且您描述的症状匹配。一种可能性是重定向内部命令上的输入,使其无法从非预期的源读取,如下所示:

project_name=`adb -s $device_sn shell getprop ro.product.device` </dev/null

但是我最喜欢的解决方案是通过改变< code>while read循环将输入传递给循环,而不是标准输入,如下所示:

while read line <&3
do
    # normal loop contents here...
done 3< <(adb devices)

这些重定向将输入传递给文件描述符#3(#0是标准输入,#1是标准输出,#2是标准错误,#3通常未使用)。使用此表单,您不必知道循环中的哪些命令可能会从标准输入读取,所以这并不奇怪(如果他们确实需要从终端读取,他们可以!)。此外,与标准管道不同,它在主shell进程中运行循环,而不是在子shell中运行,从而避免了许多奇怪的情况(比如循环中设置的变量在循环后不可用)。

但有一个缺点:进程替换,

 类似资料:
  • 我注意到一个问题,当从shell脚本循环运行多个adb命令时,大多数命令都不会执行。 这是一个示例脚本。 脚本名称:: 注释掉adb命令的输出 我连接了5台设备。在不使用theadab命令的情况下从bash文件运行时,这是输出。它遍历5个循环中的每一个。 包含ADB命令的循环输出 当取消注释adb shell命令时,它只会正确地迭代第一个循环的行。这是未注释adb命令时的输出: 有人能解释一下这种

  • 我试图在docker容器中使用docker compose来运行shell脚本。我正在使用Dockerfile构建容器环境并安装所有依赖项。然后我将所有项目文件复制到容器中。据我所知,这很有效。(我对docker还是相当陌生的,docker撰写) 我的Dockerfile: 我目前正在尝试的是: docker编写文件: 这导致容器无法启动,从日志中我得到以下结果: 有关更多参考和信息,请参阅我的e

  • 我目前正在制作一个游戏,它会一次又一次地循环,直到你猜到正确的数字。 我遇到的问题是正确获取循环命令。我想循环一段时间,但我可以让它工作,对于脚本的某些部分。如果我使用的是"而真"循环,if语句的print命令会重复一遍又一遍,但如果我使用任何符号( 非常感谢您的帮助。

  • 我正在sql plus中运行一个脚本,脚本中有一个for循环: 运行脚本时出现以下错误: ORA-06550:第6行第1列:PLS-00103:遇到符号“开始” 我哪里做错了?

  • 问题内容: 我在实现for循环时遇到问题。执行脚本时出现此错误 test1.sh:2:语法错误:循环变量错误 我不明白这个错误。 这是我的剧本 谁能告诉我ubuntu中sh(在ubuntu中它链接到破折号外壳)shell中for循环的语法? 问题答案: 您可能使用而不是。尝试,或者如果它是可执行的,则不行。

  • 我试图在mongo shell中使用脚本js。我正在读一本关于这个主题的书。我尝试了几个选项,例如在我的计算机的特定位置打开cmd。我在这里发现了一个问题“如何通过shell脚本执行mongo命令?”,但对我来说似乎什么都不管用。我的mongo工作正常,我可以输入mongo,只需在cmd中键入mongo。但是,它找不到js文件。我正在使用Windows;有人知道引擎盖下会发生什么吗? 例如: