好的,所以我对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
我确定我犯了某种语法错误,但我无法弄明白,这让我感到疯狂。我已经在网上查看了各种各样的例子,我发现我的代码没有任何问题。
答案 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)