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 ...)
複数の単語で構成される文字列が生成されると、シェルはそれを構文エラーとして扱います。拡張子を引用する必要があります。
[ "$(adb -s ...)" = *"Is the system running?"* ]
引用符で囲まれていないコマンド置換の結果は、引用符で囲まれていない変数の拡張と同様に、分割およびファイル名のグロービングを受けます。見積もり拡張により、このような状況を回避できます。あなたの場合は、問題を引き起こす部門です。
コマンド置換が拡張されると、テストは次のようになります。
if [ word1 word2 word3 = *"some string"* ]
これは明らかに構文エラーです。