我需要编写一个脚本来测试 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"* ]
这显然是一个语法错误。