【问题标题】:String equality in Bash script [duplicate]Bash脚本中的字符串相等[重复]
【发布时间】:2014-08-21 01:02:56
【问题描述】:

我想简单地测试一个 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')

【问题讨论】:

标签: android bash shell


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 太棒了,它有效!我认为 adb 的工作方式与 Windows 兼容……但他们本可以针对 Linux 版本进行更改:p
  • @Salamandar 也许吧。另外,我应该注意到使用ls 来检查文件是否存在是一种非常奇怪的方法。请参阅编辑后的答案。
  • 好吧,奇怪的是它不起作用:即使文件不存在,我也将 suFileResult 设置为 0。这很奇怪,因为当我在手机上“chroot”时,我正确地有 1 或 0,具体取决于文件的存在。
  • 对不起,我忘了转义$?。固定。
  • 啊,是的 :) 谢谢,我刚开始编写 shell 脚本(尽管我使用 cli 多年),这是一种相当困难的语言……^^''
猜你喜欢
  • 2011-03-17
  • 2020-07-11
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多