我需要编写一个脚本来测试 Android 模拟器内的服务是否已准备好安装 apk 或不使用此命令

adb -s emulator-5554 shell pm list package | grep package:com.android.

如果该命令在第一行没有输出这些子字符串中的任何一个,则 avd 尚未准备好进行 apk 安装

系统正在运行吗?

找不到服务

在线的

这是我的脚本

if [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"Is the system running?"* ] ||
   [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"Can't find service"* ] ||
   [ $(adb -s emulator-5554 shell pm list package | grep package:com.android. | head -n 1) = *"online"* ] ; then
  echo "could not find package service"
else
  echo "found package service"    
fi  

但我收到这个错误

./script.sh: line 4: [: =: unary operator expected
./script.sh: line 5: [: =: unary operator expected
./script.sh: line 6: [: =: unary operator expected

答案1

在您的测试中,如果命令替换$(adb -s ...)生成多单词字符串,shell 会将其视为语法错误。您必须引用扩展:

[ "$(adb -s ...)" = *"Is the system running?"* ]

不带引号的命令替换的结果将经历分割和文件名通配,就像不带引号的变量扩展一样。引用扩展可以避免这种情况。就您而言,正是分裂导致了问题。

随着命令替换的扩展,测试可能看起来像这样

if [ word1 word2 word3 = *"some string"* ]

这显然是一个语法错误。

相关内容