如何评估 adb shell 命令的结果?

如何评估 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出了什么问题?好的,尝试使用另一个肯定为 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

第二个管道未打印。 0后面有字符吗?尝试修剪:

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

我没主意了。

答案1

adb在换行之前添加回车符(又名0x0dCtrl-M、等)。\r可能是为了便于使用 Windows 软件,该软件期望行以 CR-LF 而不仅仅是 LF 结尾。

hexdump您可以使用aka亲自查看hd,例如:

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

因为您只需要返回一个值(退出代码)。您可以使用printf代替echo并将所有ls输出重定向到/dev/nullAndroid设备上以避免打印任何换行符(然后adb不会添加CR):

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

如果您的 Android 设备没有printf,或者您需要从 Android shell 返回一行或多行输出,您可以使用tr -d '\r'ordos2unixsed '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

答案2

另一个答案很好地解释了提问者的错误所在。这个故事的寓意是要小心计算字符,因为 adb 可能会添加一些字符。

我最终这样做了

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

相关内容