我目前正在开发一个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
答案 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