0

如果在一行中我有单词设备我想检查我的脚本我尝试了这个正则表达式

if[$SERIAL =~ /device/] 但执行结果未知。这是我的脚本我尝试仅在显示 stat 设备的设备中安装 apk,因此不脱机,您可以在下面找到我的脚本

for SERIAL in $(adb devices | tail -n +2 | cut -sf 1);
do 
    if [$SERIAL =~ /device/]
    #if [$SERIAL = "/^.*/device\b.*$/m"]
    then
        cd $1
        for APKLIST in $(ls *.apk);
        do
            echo "Installation de  $APKLIST on $SERIAL"
            adb -s  $SERIAL install -r $1/$APKLIST &
            #adb bugreport > bug.txt
        done
    fi
done
4

3 回答 3

0

尝试将您的 if 行更改为:

if [[ $SERIAL =~ "device" ]]
于 2013-03-08T12:27:46.007 回答
0

必须始终在语句中的方括号if和您正在测试的内容之间放置一个空格。您还必须了解方括号有两种类型,[ ... ]标准的和扩展的[[ ... ]]

[实际上是一个别名为test1命令的 Unix命令:

$ ls -li /bin/test /bin/[
54008404 -rwxr-xr-x  2 root  wheel  18576 Jul 25  2012 /bin/[
54008404 -rwxr-xr-x  2 root  wheel  18576 Jul 25  2012 /bin/test

您可以通过查看test手册页来查看基本测试。

Kornshell(启动它)和 BASH 都使用双方括号 ( [[ ... ]]) 为您提供扩展测试。主要[[ ... ]]用于模式匹配。模式匹配扩展了 shell 可以在命令行上执行的通配符——有点像穷人的正则表达式。较新版本的 BASH 实际上允许您使用真正的正则表达式而不是模式匹配

要记住的重要一点是,当您进行模式匹配测试(或 BASH 中的正则表达式测试)时,您必须使用双方括号,而不是只能测试字符串的单方括号。

还要记住,正则表达式可以匹配一行中的任何位置:

if [[ $SERIAL =~ "device" ]]

可以匹配devices。您要做的是添加\b以确保您匹配单词device. 是一个正\b则表达式单词边界:

if [[ $SERIAL =~ "\bdevice\b" ]]

1.是的,我知道这[是 BASH 和 Kornshell 中内置的 shell,并且[不执行/bin/[。但是,该test命令也是一个内置的 shell。

于 2013-03-08T19:51:41.263 回答
0

| cut -sf 1您的 $SERIAL 变量将只包含序列号之后。那么,您为什么要尝试将其与 匹配device?它永远不会是true。你为什么不直接使用

for SERIAL in $(adb devices | grep device$ | cut -sf 1);

而不是你的if

于 2013-03-08T18:50:06.127 回答