【问题标题】:linux shell - can't compare strings with: adb shell getprop ro.product.brandlinux shell - 无法将字符串与: adb shell getprop ro.product.brand
【发布时间】:2017-04-15 22:43:59
【问题描述】:

这真的很奇怪... 我无法让这个测试在我的 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

谁能帮助我理解这一点?

我已经尝试通过管道 cut 或 sed 来删除 $a 中的空格或换行符,但我得到了相同的结果...

【问题讨论】:

  • 您确定字符串不包含尾随空格或换行符吗?在这种情况下,这似乎是可能的问题......
  • 我想是的。请参阅下面的帖子。
  • 试试这个:echo "${#a}。这将打印变量值中的字符数,因此您可以验证没有发生任何错误(例如未显示但在比较字符串时考虑在内的不可打印字符)。
  • 这里确实有问题:字符数是7,而“华为”只有6——即使使用了下面帖子中的修剪功能。
  • 有趣的是,如果我只执行$a,我会收到消息:./test.sh: line 21: $'Huawei\r': command not found

标签: android linux bash shell adb


【解决方案1】:

我建议这是删除前导/尾随空格的一种方法:

# 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访问
  • 如果没有指定“非空白”字符来结束中间部分,那么贪婪的.* 会吃掉直到字符串结尾的所有内容,包括尾随空格。
  • 另一方面,.* 肯定以非空白开头,因为贪婪的初始 [[:blank:]]* 只会在遇到非空白时停止。

根据您的需要,您也可以使用[[:space:]] 代替[[:blank:]](此处解释差异:https://en.wikipedia.org/wiki/Regular_expression#Character_classes)。基本上,[[:blank:]] 匹配制表符和空格,[[:space:]] 也匹配换行符、回车符等等。

【讨论】:

  • 嘿,谢谢,我确实需要使用[[:space:]] 而不是[[:blank:]]。这行得通!
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2019-10-21
  • 2021-11-06
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多