2014-02-12 92 views
1
$ echo $(adb shell getprop service.adb.root) 
1 
$ while [[ $(adb shell getprop service.adb.root) != "1" ]]; do echo -n .; done 
.........^C 

[[ "1" != "1" ]]猛砸条件表达式应该是falsewhile循环不应该运行。但是,它永远在运行。什么原因和解决方法?没有工作

我正在尝试编写一个循环,等待连接的Android设备上的adbd守护进程以root身份重新启动。

+1

可以显示以下输出:'echo $(adb shell getprop service.adb.root)| cat -vte' – anubhava

+1

make that'adb shell getprop service.adb.root | cat -vte' –

+0

正确的循环如下。当adb在设备上重新启动时(以root身份),adb shell命令将打印错误。该循环丢弃错误消息。 '; while [[$(adb shell getprop service.adb.root 2>/dev/null)!= $'1 \ r']];做echo -n。完成' – apricot

回答

2

getprop命令的结果包含回车符(ASCII 0x0d)。既然你正在做一个字符串 - 不是一个数字 - 比较,你有效地运行:

[[ "1" != "1\r" ]] 

的simplist的方式来解决这个问题是明确剥离回车:

x=$(adb shell getprop service.adb.root | tr -d '\015') 

现在你的比较应该工作。

您可以看到究竟是什么getprop通过运行恢复:

$ adb shell getprop service.adb.root | od -c 
0000000 1 \r \n 
0000003 
+0

我接受这个答案,因为它解释了问题,但我喜欢anubhava提供的更简单的修复。 – apricot

2

由于ADB命令的输出有尾随\r您可以使用此while loop代替:

while [[ $(adb shell getprop service.adb.root) != $'1\r' ]]; do echo -n .; done 

即比较数字而不是字符串。

+0

为什么?什么原因? –

+0

我喜欢你的修复,但接受了其他答案,因为它解释了问题。我的低级代表不允许我为您的答案投票。 – apricot

+0

这是为了确保任何以“1”开头的字符串与我在答案中写的匹配。 – anubhava