Bash Scripting的新功能,在if语句中有一个奇怪的字符串比较问题

时间:2014-04-13 20:54:45

标签: bash

好的,所以我对Bash脚本很新,但我确实在其他语言方面有一些不错的经验。

我的脚本是从安装了USB调试的Android手机的Linux计算机上运行的。

我的脚本的工作方式是您使用./myscript.sh APP_NAME_WITHOUT_EXTENSION运行它。因此,例如,我正在运行./myscript.sh SystemUI,它会获取所有应用的列表,然后检查该列表中是否有$1.apk

以下是我从Android手机获取系统应用列表的方法:

# Get list of files in system app directory
app_list=($(adb shell ls $app_path))

这样做很好,如果我这样做:

for file in ${app_list[@]}; do
    echo $file
done

然后按预期打印出所有文件名。

现在我有了这个:

found=false
for file in ${app_list[@]}; do
        # This is ALWAYS resulting in false, even if the strings in fact match
        if [ "$1.apk" == "$file" ] || [ "$1.jar" == "$file" ]; then
        echo "TEST"
        found=true
        break
    fi
done

我确定我犯了某种语法错误,但我无法弄明白,这让我感到疯狂。我已经在网上查看了各种各样的例子,我发现我的代码没有任何问题。

2 个答案:

答案 0 :(得分:0)

您可以在一种情况下测试两种情况:

if [[ $file =~  "${1}"\.(apk|jar) ]]; then
    echo "TEST"
    found=true
    break
fi

答案 1 :(得分:0)

在我发布问题之后,我几乎就知道了这一点,但是在我回答自己的问题之前,我必须等待8个小时。无论如何,这是解决方案。

在我发布问题之后,突然想到了一个想法,"如果ls命令在文件名中添加了不可打印的字符怎么办?",所以我决定清理输入,结果在这:

for file in ${app_list[@]}; do
    file=${file//[^a-zA-Z0-9_. ]/} # This strips any non-printable characters
    # Thanks to naab for pointing out the regex conditional :)
    if [[ $file =~ "$1."("apk"|"jar") ]]; then
        found=true
        break
       fi
done

现在它有效! B)