ka3*_*3ak 1 shell bash command-substitution 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
不打印第二个管道。0后面有字符吗?尝试修剪:
$ R=$(adb shell 'ls /mnt/; echo $?' | tail -1 | xargs)
$ echo "|$R|"
|0
Run Code Online (Sandbox Code Playgroud)
我没有想法了。
adb
是加入回车(又名0x0d
,Ctrl-M
,\r
换行之前,等等)。可能是为了便于使用希望行以 CR-LF 而不仅仅是 LF 结尾的 Windows 软件。
你可以用hexdump
aka自己看到这个hd
,例如:
$ printf "$R" | hd
00000000 30 0d |0.|
00000002
Run Code Online (Sandbox Code Playgroud)
因为您只需要返回一个值(退出代码)。您可以使用printf
代替echo
并将所有ls
输出重定向到/dev/null
Android 设备上以避免打印任何换行符(然后 adb 不添加 CR):
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Run Code Online (Sandbox Code Playgroud)
如果您的 android 设备没有printf
,或者您需要从 android shell 返回一行或多行输出,则可以使用tr -d '\r'
或dos2unix
或sed 's/\r$//'
或类似的方法去除 CR。
dos2unix
并且sed
是比tr
这里更好的选择,因为它们只会删除紧跟在 LF 之后的 CR,而不会留下任何可能位于行中其他位置的 CR:
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Run Code Online (Sandbox Code Playgroud)