たとえば、電話にディレクトリが存在するかどうかを確認したいと思います。
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
私は考えが足りません。
adb
は、改行の前にキャリッジリターン(別名0x0d
、Ctrl-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を削除できます。
dos2unix
とsed
は、ここではtr
よりも適切な選択です。これは、直後にLFが続くCRのみを削除し、行の他の場所にある可能性のあるCRはそのままにするためです。
$ R="$(adb Shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000 30 |0|
00000001
もう1つの答えは、質問者がどこで失敗したかを説明するのに役立ちます。物語の教訓は、adbがいくつかを追加する可能性があるため、文字を数えることに注意することです。
私はこれをやった
R=$(adb Shell 'ls /mnt && echo SUCCESS || echo FAIL' | egrep (SUCCESS|FAIL))
echo $R