Ich muss die Dateien von einem Ordner in einen anderen kopieren. Hier befinden sich Quell- und Zielinformationen in der Textdatei.
Dateiinhalt: res.txt
/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
Hier versuche ich, den String mit dem Trennzeichen "=" aufzuteilen und ihn den entsprechenden Variablen zuzuweisen. Außerdem muss ich den Kopierbefehl auslösen.
Um das oben genannte zu erreichen, versuche ich, die Zeichenfolge in ein Array aufzuteilen und den Array-Indexelementwert den lokalen Variablen zuzuweisen
lines=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable-hdpi/logo_splash.png=/var/lib/jenkins/jobs/Android\ Gradle\ test\ build/workspace/MainApp/app/src/main/res/drawable/logo_splash.png
SOURCE=""
DEST=""
echo $lines | awk '{split($0,numbers,"=")} END {
for(n in numbers){
if (n == 1) {
SOURCE = ${numbers[1]}
}
else if (n == 2) {
DEST= ${numbers[2]}
}
}}'
echo ${numbers[1]}
echo ${numbers[2]}
bekomme Fehler als
awk: {split($0,numbers,"=")} END {for(n in numbers){ SOURCE = ${numbers[1]}}
awk: ^ syntax error
und für echo Ausgabe erhalten als
+ echo
+ echo
@Gombai Sandor, ich habe das oben genannte wie von Ihnen vorgeschlagen geändert und es funktioniert.
SOURCE=$(echo $lines | awk -F= '{print $1}')
echo "source is " $SOURCE
DESTINATION=$(echo $lines | awk -F= '{print $2}')
echo "destination is " $DESTINATION
Antwort1
Sie mischen if [...] ... elif [...] ... fi
die Syntax der Shell in den Code von awk. awk würde verwenden
if (...) {
...
} else if (...) {
...
}
in diesem Kontext.
Darüber hinaus erwarten Sie, dass das Array von awk hier in der übergeordneten Shell von awk angezeigt wird
echo ${numbers[1]}
echo ${numbers[2]}
Dies wird nicht passieren. Sie können Zeichenfolgen in awk schreiben und die Ausgabe in der Shell analysieren. awk (oder ein anderes Programm) wird seine aufrufende Umgebung nicht beschädigen.
Wo der Syntaxfehler angezeigt wird, ist eine andere Mischung:
${numbers[1]}
ist eine Referenz auf ein Bash-Array-Element ... in einem Awk-Code (es hat für Awk fast eine Bedeutung, aber ich empfehle, dies nicht zu erzwingen).
Ich würde empfehlen, genau zu beschreiben, WAS Ihre Aufgabe ist, und nach Hinweisen zu fragen, denn WIE Sie sie hier lösen möchten und zu erklären, warum es nicht funktionieren wird, würde etwas langatmig werden. Aber zunächst einmal sollten Sie sich darüber im Klaren sein, dass Shell (und ihre Sprache) eine Sache ist und awk (und seine Sprache), das darin ausgeführt wird, eine andere. Sie haben ähnliche Elemente, aber das ist NUR die Ähnlichkeit.
Einen String in zwei Teile aufzuteilen, wenn diese durch ein einzelnes Zeichen verbunden sind, ist ziemlich einfach und erfordert kein awk. „cut“ ist das grundlegende Aufteilungsprogramm.
SOURCE=$(echo $lines | cut -f1 -d=)
fügt das erste Feld in SOURCE ein, wobei die Felder in der Eingabe von durch = getrennt sindschneiden Gelegentlich können Sie auf Codes stoßen wie:
SOURCE=$(echo $lines | awk -F= '{print $1}')
was dasselbe ist. DEST kann mit beiden Methoden ähnlich zugewiesen werden, jedoch mit dem Ziel des zweiten Felds.