Android adb不使用bash中的变量

Android adb不使用bash中的变量,android,linux,bash,adb,Android,Linux,Bash,Adb,我正在尝试从我的android手机(根)导出所有APK 我已使用adb shell pm list将所有包转储到一个文件中 com.google.android.ears com.android.voicedialer ... com.google.android.ears com.android.voicedialer ... 现在我想下载它们,但不起作用: #!/bin/bash while read line; do echo "Name: $line"

我正在尝试从我的android手机(根)导出所有APK

我已使用adb shell pm list将所有包转储到一个文件中

com.google.android.ears com.android.voicedialer ... com.google.android.ears com.android.voicedialer ... 现在我想下载它们,但不起作用:

#!/bin/bash

while read line; do
        echo "Name: $line"
        # get package path
        p=$(adb shell pm path $line);
        # remove package: prefix
        p=$(echo $p | grep -Po "(?<=package:).*" | xargs)
        echo "Path: $p"
        # download it
        adb pull $p
done;
#/bin/bash
读行时;做
echo“名称:$line”
#获取包路径
p=$(adb壳牌项目管理路径$行);
#删除包:前缀

p=$(echo$p | grep-Po)(?正如注释中指出的,
adb
命令以
\r
结尾。您也必须将其从此行中删除

p=$(adb shell pm path $line)
有点像

p=$(adb shell pm path $line | tr -d '\r')
#!/bin/bash

while read line; do
  echo "Name: $line"
  # get package path
  p=$(adb shell pm path $line | sed 's/^package://;s/\r$//')
  echo "Path: $p"
  # get package name
  name=$(echo $p | awk -F/ '{print $(NF-1)}')
  echo "Package name: $name"
  # download it
  adb pull $p ${name}.apk
done < <(adb shell pm list packages | sed 's/^package://;s/\r$//')
我看到另一个问题:许多apk将被覆盖为
base.apk

Name: com.google.android.youtube
Path: /data/app/com.google.android.youtube-1/base.apk
Name: net.mx17.overridedns
Path: /data/app/net.mx17.overridedns-2/base.apk
Name: com.android.email
Path: /system/app/Email/Email.apk
所以我想我应该用这样的东西

p=$(adb shell pm path $line | tr -d '\r')
#!/bin/bash

while read line; do
  echo "Name: $line"
  # get package path
  p=$(adb shell pm path $line | sed 's/^package://;s/\r$//')
  echo "Path: $p"
  # get package name
  name=$(echo $p | awk -F/ '{print $(NF-1)}')
  echo "Package name: $name"
  # download it
  adb pull $p ${name}.apk
done < <(adb shell pm list packages | sed 's/^package://;s/\r$//')
!/bin/bash
边读边做
echo“名称:$line”
#获取包路径
p=$(adb外壳pm路径$line | sed's/^package://;s/\r$/'))
echo“路径:$p”
#获取包名
名称=$(echo$p | awk-F/'{print$(NF-1)}')
echo“包名:$name”
#下载它
adb pull$p${name}.apk

完成p=$(echo$p | grep-Po)(?查看输出,在该行路径之后是它应该的。如果你这样说,但显然有一些微妙的事情在发生-你是说如果你只做
adb pull com.google.android.ears
,那么这就行了吗?顺便说一下,我认为
p=$(awk-F:'/package/{print$2}“您的问题可能是adb为了windows兼容性而在其响应中潜入的回车符。您通常不会在unix终端上看到这些回车符,但它们会对传统的逐行shell脚本处理造成严重破坏,除非在脚本中进行剥离。这已经讨论过很多次了。do
adb shell pm list packages | tr-d'\r'
获取您的列表