Bash脚本中的字符串相等性

时间:2014-08-21 01:02:56

标签: android bash shell

我想简单地测试一个Android设备是否来自计算机(对于root / backup / flash脚本)。 所以我必须测试su二进制文件的一些位置。这是我的代码:

#!/bin/sh


#####################
## ROOT CHECK

SU_LOCATIONS="/system/bin/su /system/xbin/su"

check() {
    echo "Checking for SU binary…"
    for file in $SU_LOCATIONS
    do
        suFileResult=`$ADB shell "ls $file"`
        echo "suFileResult = $suFileResult"
        echo "file         = $file"
        if [ "$suFileResult" == "$file" ];
            then echo "Su trouvé à $suFileResult"
        fi
    done
    echo "$suFileResult" > tmpbak/suFil
}

问题是即使file == suFileResult,“if”也返回false。如果我删除==周围的空格,“if”将始终返回TRUE ...

我做错了什么?如果你提供另一种方法来测试文件(以及在哪里),那将是完美的。

感谢您的回答!

PS:字符串可以包含空格,例如:

/system/bin/su: No such file or directory

编辑回答:

顺便说一下,我想了解如何删除这个讨厌的\ r字符:添加

| tr -d '\r'

将删除所有字符串中的此字符(不仅在结尾处)。所以在我的情况下:

suFileResult=$(adb shell "[[ -e $file ]]; echo \$?;" | tr -d '\r')

1 个答案:

答案 0 :(得分:-1)

由于一些奇怪的原因adb返回带有DOS行尾(\r\n)的字符串。

$ suFileResult="$(adb shell "ls $file")"
$ set | grep suFileResult
suFileResult=$'/system/bin/su\r'

所以正确的condidtion语句可能如下所示:

[[ $suFileResult == ${file}$'\r' ]]

另外,我应该注意,使用ls检查文件存在是一种非常奇怪的方法,即使adb没有返回错误代码,也可以将其打印到STDOUT:

suFileResult=$(adb shell "[[ -e $file ]]; echo \$?")
if [[ $suFileResult == $'0\r' ]]; then
    echo "Su trouvé à $file"
fi