2016-11-02 1 views
0

Ausführung Dies ist ein Problem für verdrahteten days.I verwirrend ich will eine Klasse vollständige Klassennamen zu bekommen aus der Java-Code-Datei in shell.We analysieren können Paketnamen aus wie bekommen:String verketten Fehler in Shell-Skript

Paket com.android.mail.ui;

und den Klassennamen aus dem Code-Dateipfad abrufen, verwenden Sie den Shell-Befehl 'Basisname'. unten ist mein Shell-Scripts:

#!/bin/bash 
get_package_name(){ 
    java_file=$1 
    if [ ! -f $file_path ]; then 
     echo "Sorry,the java file is not exist:$1,please check" 
     exit 1 
    fi  
    class_base_name=`basename "$java_file" .java` 
    echo "class_base_name:$class_base_name" 
    package_name=`grep $java_file -e "^package" | awk -F " " '{print $2}' | tr ';' ' ' | sed 's/ //g'` 
    echo "package_name get result:$?" 
    echo "package_name:$package_name" 

Methode 1 verwenden variable concat direkt

classpath_name=$package_name.$class_base_name 
    echo "method 1 classpath_name:$classpath_name" 

Methode 2, Verwendung sed concat indirekt

classpath_name2=`echo "aa.bb" | sed "s/aa/$package_name/" | sed "s/bb/$class_base_name/"` 
    echo "method 2 classpath_name2:$classpath_name2" 

}

erhalten ersetzen

Das Problem ist: für einige Code-Datei die Ergebnis ist in Ordnung, wie: „class_base_name: MailTransport package_name get Ergebnis: 0 package_name: com.android.email.mail.transport Methode 1 classpath_name: com.android.email.mail.transport.MailTransport Methode 2 classpath_name2: com .android.email.mail.transport.MailTransport "

für andere ist es Ausgabe lautet:" class_base_name: EmailApplication package_name bekommen Ergebnis: 0 package_name: com.android.email .EmailApplicationh_name: com.android.email .EmailApplicationh_name2 : com.android.email "

das Ergebnis ist total messing und falsch.Ich bezweifle, es bezieht sich t Er Code Inhalte, die wirklich Sinn machen für das Ergebnis?

Antwort

1

Dies passiert, weil einige Ihrer Dateien Windows-Stil CRLF (\r\n) Zeilenenden verwenden.

Hier ist ein Beispiel, wo es funktioniert, ein normaler LF Unix-Stil (\n) beenden Datei:

$ file WorkingFile.java 
WorkingFile.java: ASCII text 

$ cat -v WorkingFile.java 
package foo.bar.baz; 

$ get_package_name WorkingFile.java 
class_base_name:WorkingFile 
package_name get result:0 
package_name:foo.bar.baz 
method 1 classpath_name:foo.bar.baz.WorkingFile 

Hier ist ein Beispiel, wo es fehlschlägt, mit CRLF Linienbegrenzer:

$ file FailingFile.java 
FailingFile.java: ASCII text, with CRLF line terminators 

$ cat -v FailingFile.java 
package foo.bar.baz;^M  <--- note hidden control char revealed by -v 

$ get_package_name FailingFile.java 
class_base_name:FailingFile 
package_name get result:0 
package_name:foo.bar.baz 
.FailingFilesspath_name:foo.bar.baz 

zu beheben Sie können die zusätzlichen Wagenrücklaufzeichen mit tr -d '\r' löschen. Ich wechselte von Legacy-Backticks zu modernen $() Probleme mit Schrägstrichen zu vermeiden:

package_name=$(grep $java_file -e "^package" | awk -F " " '{print $2}' | tr ';' ' ' | sed 's/ //g' | tr -d '\r') 

Weitere Informationen this relevant post sehen.

+0

Sie ROCKKCOR! Ich hoffe, ich kann plus 100 für dich, das rettet mich! –

Verwandte Themen