2017-04-15 100 views
-1

這真的很奇怪... 我不能得到這個測試,導致在我的linux外殼真實,我無法圖爲什麼。linux外殼 - 無法比較字符串:adb外殼getprop ro.product.brand

#!/bin/bash 
a=$(adb shell getprop ro.product.brand) 
adb shell getprop ro.product.brand 
if [ "$a" == "Huawei" ]; then 
echo "Success" 
else 
echo "Failed" 
fi 

腳本只是輸出:

Huawei 
Failed 

鑑於此腳本:

b=$(whoami) 
whoami 
if [ "$b" == "amo" ]; then 
echo "Success" 
else 
echo "Failed" 
fi 

...輸出:

amo 
Success 

誰能幫助我理解?

我已經嘗試過切掉空格或換行符在$一個由管道切割或sed的,但我得到了同樣的結果...

+0

您確定該字符串不包含尾隨空格或換行符嗎?這似乎是在這種情況下可能出現的問題...... – Fred

+0

我這麼認爲。看到下面的帖子。 –

+0

試試這個:'echo「$ {#a}'這會打印出變量值中的字符數,所以你可以驗證沒有任何犯規行爲(比如一個不可打印的字符沒有顯示,但是在比較字符串時需要考慮) – Fred

回答

0

我建議這樣的一種方式來刪除前導/尾隨空白:

# Trims $1 
# If $2 supplied, assigns result to variable named $2 
# If $2 not present, echoes the value to stdout 
trim() 
{ 
    if 
    [[ $1 =~ ^[[:blank:]]*(.*[^[:blank:]])[[:blank:]]*$ ]] 
    then 
    local result="${BASH_REMATCH[1]}" 
    else 
    local result="$1" 
    fi 
    if 
    (($# > 1)) 
    then 
    printf -v "$2" %s "$result" 
    else 
    printf %s "$result" 
    fi 
} 

該函數不使用外部程序,所以開銷較低。

也許正則表達式簡單的解釋...

^[[:blank:]]*(.*[^[:blank:]])[[:blank:]]*$ 
  • 這一切前後空白(不足爲奇)
  • 在中間匹配,它的任何字符串匹配以非空白結尾並將其保存爲用於訪問的子表達式BASH_REMATCH
  • 如果沒有指定結束中間部分的「非空白」字符,則貪婪.*將一直到第e字符串的結尾,包括尾隨空格。
  • 另一方面,.*確定以非空白開始,因爲貪婪的初始[[:blank:]]*只會在遇到非空白時停止。

根據您的需求,您也可以使用[[:space:]]代替[[:blank:]](差值這裏解釋:https://en.wikipedia.org/wiki/Regular_expression#Character_classes)。基本上,[[:blank:]]匹配製表符和空格,而[[:space:]]也匹配換行符,回車符和其他幾個。

+0

嘿,謝謝你,我的確需要用'[[:space:]]'而不是'[[:blank: ]]'。這是有效的! –