2014-02-12 135 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