Android 自动化测试 - 如果在将命令输出分配给变量时条件失败,Linux bash

标签 android linux bash shell

我正在构建测试环境来测试 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/

相关文章:

bash - 使用 os.system 正确处理从 Python 转义的 shell

Android Kotlin (Instrumented) 测试,断言 ImageButton 具有正确的资源不起作用

java - 显示来自 InputStream 的图像

java - 返回已完成和待处理任务的计数

android - 如何获取附近城市的天气预报

linux - 使用 tar 命令时如何防止覆盖现有文件

将 IP 从 C 字符串转换为无符号整数?

java - 为什么操作系统说它有足够的内存时不能分配内存给jvm

linux - statx 停止给予 EPERM 需要哪些能力

PHP 替换控制台中的最后一个 x 字符