Search code examples
androidlinuxbashshelladb

linux shell - can't compare strings with: adb shell getprop ro.product.brand


This is really odd... I can't get this test to result in true in my linux shell and I can't figure out why.

#!/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

The script just outputs:

Huawei
Failed

Whereas this script:

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

...outputs:

amo
Success

Can anyone help me understand that?

I already tried cutting away spaces or line breaks in $a by piping to cut or sed but I get the same result...


Solution

  • I suggest this as a way to remove leading/trailing whitespace :

    # 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
    }
    

    This function uses no external program, so has low overhead.

    Maybe a quick explanation of the regular expression...

    ^[[:blank:]]*(.*[^[:blank:]])[[:blank:]]*$
    
    • It matches all leading and trailing whitespace (no surprise there)
    • In the middle, it matches any string of characters that ends with a non-blank and saves that as a sub-expression for access with BASH_REMATCH
    • If there were no "non-blank" character specified to end the middle portion, the greedy .* would eat everything up until the end of the string, including trailing blanks.
    • The .* is, on the other hand, certain to begin with a non-blank, because the greedy initial [[:blank:]]* will only stop when encountering a non-blank.

    Depending on your need, you may also use [[:space:]] instead of [[:blank:]] (difference explained here : https://en.wikipedia.org/wiki/Regular_expression#Character_classes). Basically, [[:blank:]] matches tabs and spaces, and [[:space:]] also matches newlines, carriage returns, and a few more.