2017-04-15 13 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のために配管により$ aにスペースや改行を切り取ってみましたが、私は同じ結果を得る...

+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
  • 中間部分を終了するために「空白でない」文字が指定されていない場合、貪欲.*はすべて文字列の末尾に空白が含まれます。
  • .*は、空白ではないことから始まることが確実です。これは、欲張りの最初の[[:blank:]]*が空白でない場合にのみ停止するためです。

あなたの必要性に応じて、あなたはまた、[[:space:]]代わりの[[:blank:]]使用することができます(違いは、ここで説明:https://en.wikipedia.org/wiki/Regular_expression#Character_classes)。基本的には、[[:blank:]]はタブとスペースに一致し、[[:space:]]は改行、復帰などにも一致します。

+0

本当にありがとう、私は本当に '[[:space:]]'の代わりに '[[:space:]]'を使用する必要がありました。 ]] 'それは動作します! –

関連する問題