2017-04-15 122 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: ]]'。这是有效的! –