Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android自动化测试-在将命令输出分配给变量时,如果条件失败,Linux bash_Android_Linux_Bash_Shell - Fatal编程技术网

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

Android自动化测试-在将命令输出分配给变量时,如果条件失败,Linux bash,android,linux,bash,shell,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

我正在构建测试环境来测试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
此脚本的输出如下所示:

文件位置:0

/找不到proc/emmc

正如您可以从其输出中看到的,找到了文件(“文件位置”显示为0),但是bash if条件失败,我不理解为什么

为了进一步理解这个问题,我尝试替换所有受支持的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
此脚本的输出如下所示:

文件位置:0

/发现了proc/kallsyms

在这里找到文件

总结如下:

在这两种情况下,对于ADB或Linux机器上的本地,“文件位置”显示正确的位置,即“文件位置:0”

但是,在第一个脚本中使用if语句时失败(在adb shell之后)


我在网上搜索了一下,没有找到解决那个问题的办法。任何反馈都会很好

嗯。我拿了我的手机并测试了一下。关键是:由于某种奇怪的原因,
adb
返回以DOS行结尾的字符串(
\r\n

因此,正确的说法可能如下所示:

$ 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

中使用
echo“$filelocation”| od-a
输出什么?我怀疑存在一个特殊字符(我认为您得到了“0\n”,即
echo
命令中的换行符)。它与
echo-n0
echo-n1
一起工作是否更好?@syme它确实是隐藏字符。。。通过
tr-d“\r\n”
管道传输adb输出解决了问题。谢谢@德米特里,谢谢你的快速回复。事实上,“\r\n”是麻烦制造者。通过“tr-d”传递adb输出的赋值以删除“\r\n”解决了问题。修改后的行如下:
filelocation=`adb shell su-c“if[-e'/proc/kmsg'];然后echo 0;否则echo 1;fi“| tr-d”\r\n”`
@Dimitry检查了答案并试图进行投票。不幸的是,由于我对StackOverflow用户来说确实是新手,所以我的重复次数太少,所以这次我无法向上投票:-)
ISFILEEXISTS="$(adb shell '[ -e /proc/kmsg ]; echo $?')"
ISFILEEXISTS="${ISFILEEXISTS%$'\r'}"