Shell Speichern Sie die Array-Elementwerte in den Variablen


0

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 / Hauptanwendung / 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 "=" zu teilen und den jeweiligen Variablen zuzuordnen. Und müssen den Kopierbefehl auslösen.

Um dies zu erreichen, versuche ich, den String in ein Array aufzuteilen und den lokalen Variablen den Wert des Array-Indexelements 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]}

Fehler erhalten 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 dir 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

Antworten:


1

Sie mischen die Shell- if [...] ... elif [...] ... fiSyntax in den awk-Code. awk würde verwenden

if (...) {
   ...
} else if (...) {
   ...
}

in diesem Zusammenhang.

Außerdem wird erwartet, dass das Array von awk hier in der übergeordneten Shell von awk angezeigt wird

echo ${numbers[1]}
echo ${numbers[2]}

Das wird nicht passieren. Sie können Zeichenfolgen in awk schreiben und analysieren, dass die Ausgabe in der Shell put awk (oder einem anderen Programm) die aufrufende Umgebung nicht beeinträchtigt.

Wo der Syntaxfehler angezeigt wird, ist eine andere Mischung:

${numbers[1]}

ist eine Bash-Array-Elementreferenz ... in einem awk-Code (es hat fast eine Bedeutung für awk, aber ich schlage vor, dies nicht zu erzwingen).

Ich würde empfehlen, zu beschreiben, WAS genau Ihre Aufgabe ist, und nach Hinweisen zu fragen, denn WIE Sie es hier lösen möchten und zu erklären, warum es nicht funktioniert, wird ein bisschen lang sein. Aber zuerst sollten Sie die Sache verdauen, die Shell (und ihre Sprache) ist, und awk (und ihre Sprache), die darin läuft, ist eine andere. Sie haben ähnliche Elemente, aber das ist NUR Ähnlichkeit.

Nur eine Zeichenfolge in zwei Teile zu teilen, wenn sie über ein einzelnes Zeichen verbunden sind, ist ziemlich einfach und erfordert keine awk. cut ist das grundlegende Aufteilungsprogramm.

SOURCE=$(echo $lines | cut -f1 -d=)

Setzt das erste Feld in SOURCE, wobei die Felder bei der Eingabe von cut durch = getrennt sind. Gelegentlich können Sie auf Codes stoßen wie:

SOURCE=$(echo $lines | awk -F= '{print $1}')

das ist das gleiche. DEST kann mit beiden Methoden auf ähnliche Weise zugewiesen werden, wobei jedoch das zweite Feld als Ziel ausgewählt wird.


awk verwendet "then" nicht, erwartet aber {} um Befehlsblöcke von if / else, wenn sie mehr als einen Befehl enthalten
Gombai Sándor

Vielen Dank, weitere Beschreibung für die genaue Anforderung hinzugefügt
Nagaraj ks

Danke Es funktioniert. Ich habe mehr als Stunden darin festgehalten, du hast mir Zeit gespart.
Nagaraj ks

Froh, dass ich Helfen kann. Viel Spass damit!
Gombai Sándor

cp -f / var / lib / jenkins / jobs / Android \ Gradle \ test \ build / workspace / Hauptanwendung / app / src / main / res / drawable-hdpi / logo_splash.png / var / lib / jenkins / jobs / Android \ Gradle \ test \ build / workspace / Hauptanwendung / app / src / main / res / drawable / logo_splash.png Früher habe ich versucht, die obige Zeile aus der Datei zu lesen und den Befehl auszuführen, aber immer den Fehler "line 21: / src / main / res / drawable / logo_splash.png: Keine solche Datei oder Verzeichnis "
Nagaraj ks
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.