2017-07-10 5 views
0

Ich arbeite gerade an einem BASH-Skript, um den Pfad aller Anwendungen über ADB zu erhalten, um es danach zu ziehen. Ich bekomme eine leere Zeile als Ergebnis des letzten Echos.ADB-Befehl liest keine bash-Variable und gibt eine leere Zeile zurück

Wenn ich einen Paketnamen direkt statt $ pkg schreibe, funktioniert il. Sieht aus wie die $ pkg Variable ist nicht gut „verdaut“ von adb shell Uhr Pfad

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

kümmern müssen können Sie die Ausgabe von 'adb shell Uhr Liste Pakete veröffentlichen -3' und was ist Ihre Aktion aus ihm heraus? – Inian

+0

'line = $ (echo" $ zeile "| tr -d '\ r')'. – chepner

Antwort

0

Ihr Versuch von line den Wagenrücklauf zu strippen ist falsch; als Ergebnis endet pkg immer noch mit einem Wagenrücklauf. Sie müssen

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

jedoch schreiben, eine einfachere Methode ist, anstatt Parameter Erweiterung zu verwenden:

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

Weiterhin sollten Sie keine for-Schleife über die Ausgabe eines Befehls iterieren. Verwenden Sie eine while Schleife mit read statt:

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

Danke für Ihre Hilfe! Ich werde die Weile im Auge behalten. – user2891155

0

Sie haben zwei verschachtelte Schleifen - halten die internen Audio im Inneren des Gerätes ausgeführt und verwenden adb exec-out statt adb shell. Auf diese Weise werden Sie nicht über zusätzliche \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 
Verwandte Themen