Android linux shell-can';t将字符串与:adb shell getprop ro.product.brand进行比较

Android linux shell-can';t将字符串与:adb shell getprop ro.product.brand进行比较,android,linux,bash,shell,adb,Android,Linux,Bash,Shell,Adb,这真的很奇怪。。。 在我的linux shell中,我无法让这个测试结果为真,我也不知道为什么 #!/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

这真的很奇怪。。。 在我的linux shell中,我无法让这个测试结果为真,我也不知道为什么

#!/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在$a中切割空格或换行符,但我得到了相同的结果…

我建议将此作为删除前导/尾随空格的一种方法:

# 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\u REMATCH
  • 如果没有为中间部分的结尾指定“非空”字符,贪婪的
    *
    将吃掉所有内容,直到字符串结束,包括尾随空格
  • 另一方面,
    *
    肯定以非空开头,因为贪婪的首字母
    [[:blank:][]*
    只有在遇到非空时才会停止

根据您的需要,您也可以使用
[[:space:][]
而不是
[[:blank:][]
(此处解释的差异:)。基本上,
[[:blank:][]
匹配制表符和空格,
[:space:][]
还匹配换行符、回车符和其他一些字符。

您绝对确定字符串不包含尾随空格或换行符吗?这似乎是这种情况下可能出现的问题……我想是的。请参阅下面的帖子。尝试以下操作:
echo“${#a}
。这将打印变量值中的字符数,因此您可以验证是否没有任何错误(例如未显示不可打印的字符,但在比较字符串时将其考虑在内)。这里确实有些错误:字符数是7,虽然“华为”只有6个-即使在使用了下面帖子中的修剪功能后也是如此。有趣的是,如果我只是执行
$a
,我会得到消息:
/test.sh:line 21:$'Huawei\r':找不到命令
嘿,谢谢,我确实需要使用
[:space:]
而不是
[:blank:][]
。这很有效!