我正在编写一个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
我在这里猜测,但可能是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循环的语法? 问题答案: 您可能使用而不是。尝试,或者如果它是可执行的,则不行。
我有一个简单的bash脚本,它在设备列表中迭代,并对Android设备运行adb shell命令。代码如下: 运行时,代码将在一个设备上成功运行所有配置。插入两个设备时,输出读数如下: