我正在构建测试环境来测试 Android 手机。作为此环境的一部分,我正在搜索 Android 中是否存在某些文件(使用“adb shell”)。如果找到该文件,我想在连接到 Android 的 PC 中执行其他功能。
设置:Linux 机器(ubuntu 12.04)连接到 android 手机。
以下 bash 脚本应执行此功能:
#!/bin/bash
filelocation=`adb shell su -c "if [ -e '/proc/kmsg' ]; then echo 0; else echo 1; fi"`
echo "file location: $filelocation"
if [ "$filelocation" == "0" ]
then
{
echo "/proc/emmc was found"
}
else
echo "/proc/emmc was NOT found"
fi
该脚本的输出如下:
file location: 0
/proc/emmc was NOT found
正如您从它的输出中看到的那样,文件已找到(“文件位置”显示 0),但 bash 如果条件失败,我不明白为什么。
为了进一步了解这个问题,我尝试为所有受支持的 bash 括号类型(即 ((...))、[..] 和 [[...]] )替换 if 条件,但所有努力都失败了。此外,我已将条件本身从 sting (==) 比较更改为整数比较 (-eq),但它也失败了。
为了再次验证我的操作,我创建了以下脚本,只是为了调试它:
#!/bin/bash
filelocation=`if [ -e /proc/kallsyms ]; then echo 0; else echo 1; fi`
echo "file location: $filelocation"
if [ "$filelocation" == "0" ]
then
{
echo "/proc/kallsyms was found"
}
else
echo "/proc/kallsyms was NOT found"
fi
该脚本的输出如下:
file location: 0
/proc/kallsyms was found
在这里找到文件。
总结:
在这两种情况下,无论是使用 ADB 还是在本地 Linux 机器上,“文件位置”都会显示正确的位置——即“文件位置:0”
但是,当在第一个脚本中使用 if 语句时,它会失败(在 adb shell 之后)。
我已经在网上搜索过,但找不到解决该问题的方法。任何反馈都会很棒!
最佳答案
嗯。我已经拿起手机进行测试。关键是:出于某种奇怪的原因adb
返回带有 DOS 行结尾 ( \r\n
) 的字符串。
$ ISFILEEXISTS="$(adb shell '[ -e /proc/kmsg ]; echo $?')"
$ set | grep ISFILEEXISTS
ISFILEEXISTS=$'0\r'
所以正确的说法可能是这样的:
$ if [[ $ISFILEEXISTS == $'0\r' ]]; then echo Y; else echo N; fi
Y
但是如果什么adb
返回可以在下面再次使用,一次去除所有无关的字符会更好:
ISFILEEXISTS="$(adb shell '[ -e /proc/kmsg ]; echo $?')"
ISFILEEXISTS="${ISFILEEXISTS%$'\r'}"
顺便说一下,如你所见,/proc/
文件系统非常适合非特权用户阅读,因此您不需要 su
.
关于Android 自动化测试 - 如果在将命令输出分配给变量时条件失败,Linux bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25084958/