adbシェルコマンドの結果を評価する方法は?

adbシェルコマンドの結果を評価する方法は?

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

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に何の問題がありますか?さて、間違いなくゼロの異なる変数を試してみてください。

$ 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

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

hexdumpakaを使って直接確認できます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シェルから1つ以上の出力行を返す必要がある場合、またはtr -d '\r'同様の機能dos2unixを使用してsed 's/\r$//'CRを削除できます。

dos2unixLFのすぐ次のCRだけを削除し、行の他の場所にある可能性のあるCRは残すため、sedここよりも優れたオプションがあります。tr

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

おすすめ記事