ADB命令不读取bash变量并返回空行

时间:2017-07-10 10:36:50

标签: bash adb

我目前正在开发一个BASH脚本,以便通过ADB获取所有应用的路径,然后再将其拉出来。我得到一个空行作为最后一个回声的结果。

如果我直接写一个包名,如果是$ pkg,则il工作。看起来$ pkg变量没有被 adb shell pm路径“消化”

for line in $(adb shell pm list packages -3)
do
    line=$line | tr -d '\r'
    pkg=${line:8}
    path=$(adb shell pm path $pkg | tr -d '\r')
    echo $path
done

2 个答案:

答案 0 :(得分:0)

您尝试从line剥离回车是不正确的;结果,pkg仍然以回车结束。你需要写

line=$(echo "$line" | tr -d '\r')

但是,更简单的方法是使用参数扩展:

line=${line%$'\r'}

此外,您不应该使用for循环来迭代命令的输出。使用while循环代替read

while IFS= read line; do
    line=${line%$'\r'}
    pkg=${line:8}
    path=$(adb shell pm path "$pkg" | tr -d '\r')
    echo "$path"
done

答案 1 :(得分:0)

您有2个嵌套循环 - 保持内部循环在设备内运行并使用adb exec-out而不是adb shell。这样您就不必担心额外的\r

for p in $(adb exec-out 'for p in $(pm list packages -3); do pm path ${p:8}; done')
do
  adb pull ${p:8}
done