web-dev-qa-db-ja.com

adb Shellコマンドの結果を評価するにはどうすればよいですか?

たとえば、電話にディレクトリが存在するかどうかを確認したいと思います。

R=$(adb Shell 'ls /mnt/; echo $?' | tail -1);

$ echo $R
0

$ if [ "$R" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi
: integer expression expected
Path exists

Rの何が問題になっていますか? OK、間違いなく0である別の変数で試してみてください。

$ x=0
$ if [ "$x" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi

Path exists

$ echo "|$x|"
|0|

$ echo "|$R|"
|0

2番目のパイプは印刷されません。 0の後に文字はありますか?トリミングしてみてください:

$ R=$(adb Shell 'ls /mnt/; echo $?' | tail -1 | xargs)
$ echo "|$R|"
|0

私は考えが足りません。

1
ka3ak

adbは、改行の前にキャリッジリターン(別名0x0dCtrl-M\rなど)を追加しています。おそらく、行がLFだけでなくCR-LFで終わることを期待するWindowsソフトウェアでの使いやすさのためです。

これは、hexdump別名hdで自分で確認できます。例:

$ printf "$R" | hd
00000000  30 0d                                             |0.|
00000002

単一の値(終了コード)を返すだけでよいためです。 printfの代わりにechoを使用し、lsのすべての出力をAndroidデバイスの/dev/nullにリダイレクトして、印刷を回避することができます改行(adbはCRを追加しません):

R="$(adb Shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"

Androidデバイスにprintfがない場合、またはAndroid Shellから1行以上の出力を返す必要がある場合、tr -d '\r'またはdos2unixまたはsed 's/\r$//'などを使用して、CRを削除できます。

dos2unixsedは、ここではtrよりも適切な選択です。これは、直後にLFが続くCRのみを削除し、行の他の場所にある可能性のあるCRはそのままにするためです。

$ R="$(adb Shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000  30                                                |0|
00000001
7
cas

もう1つの答えは、質問者がどこで失敗したかを説明するのに役立ちます。物語の教訓は、adbがいくつかを追加する可能性があるため、文字を数えることに注意することです。

私はこれをやった

R=$(adb Shell 'ls /mnt && echo SUCCESS || echo FAIL' | egrep (SUCCESS|FAIL))
echo $R