Geier0815 schrieb:
gibt es eine Möglichkeit mehr als ein awk-Feld in verschiedene bash-Variablen zu schreiben?
sicherlich geht auch das, aber muss ich etwas genauer erklären,

weil dort eine kleine Falle ist, die man verstehen muss, um sowas zu lösen.
um mehrere Bash-Variablen gleichzeitig zuzuweisen muss man so einen Befehl wie zB "read" verwenden.
Wenn man aber jetzt zum Beispiel schreibt:
Code:
echo "A B C D E F" | read V1 V2 V3 V4 V5 V6
echo $V1
echo $V2
...
würde man feststellen die Variablen sind leer. :???:
Problem sind hier die Subprozesse, ich habe hier einmal einen Bash-Prozess der das "echo" ausführt, und eine Subprozess, der das "read" ausführt, beide sind über eine Pipe verbunden. Zwar werden im Subprozess die Variablen richtig gesetzt, aber wenn "read" fertig ist, dann wird sein Subprozess beendet und die Bash die den "echo" Befehl ausgeführt hat, läuft weiter. Aber dieser Prozess kann überhaupt nichts von den Variablen wissen die im Subprozess gesetzt oder verändert worden sind.
Um bei diesem Beispiel zu bleiben, man muss die Variablen in der Subshell auslesen, in der sie mit den richtigen Werten vorhanden sind. Also zB so hier.
Code:
echo "A B C D E F" | ( read V1 V2 V3 V4 V5 V6 ; echo $V1; echo $V2)
Man muss also hier immer sehr genau aufpassen das man den read-Befehl in den richtige Prozess hat, also die Bashvariablen in dem Prozess hat in dem sie dann verarbeitet werden sollen, oder von wo ich sie exportieren kann, und nicht in einen Subprozess der anschließend mit den geänderten Variablen stirbt . Exportieren kann man sie, aber Werte von Variablen nicht rückwärts vererben, das ist eben Shell, dort gibt es keine globalen Variablen und auch keine Zeiger und Referenzen mit denen man in anderen Prammiersprachen dieses Problem erschlagen würde.
Es gibt mehrere Möglichkeiten,, ich möchte nicht hier alle verwirren in dem ich hier 10 mögliche Umgehungen dieses Problemes aufliste, wer hier im Forum sucht, wird sicherlich fündig, solche Probleme hatten wir schon gelegentlich mal gehabt.
Zurück zu Aufgabenstellung in diesem Thread. Die Ausgabe von awk in verschiedene Bash-Variablen setzen, ohne awk mehrfach aufzurufen.
Eine recht einfache Umgehung des Subprozessproblems "
<<<" , eine Sonderform des Here-Dokuments, ist nachzulesen in der Manpage der bash, aber nur als ein winziger Satz.
bash(1) schrieb:
A variant of here documents, the format is:
<<<word
The word is expanded and supplied to the command on its standard input.
setzte ich für "word" eine Befehlsubstitution ein, dann wird dieser Befehl ausgeführt und dessen Ausgabe dem Standard Eingabekanal zugeführt.
Die Lösung in diesem Fall hier könnte das zB so aussehen. ( #auskommentiert was jetzt nicht mehr benögtigt wird.)
Code:
#!/bin/bash
eingang="/tmp"
IFS=$'\n'
for datei in $(ls -lA --time-style=+%Y\ %m\ %d "$eingang")
do
# jahr=`echo "$datei" | awk '{print $6}'`
# monat=`echo "$datei" | awk '{print $7}'`
# tag=`echo "$datei" | awk '{print $8}'`
# dateiname=`echo "$datei" | awk '{print $9}'`
# test=`echo "$datei" | awk '{print $1}'`
read jahr monat tag dateiname test <<< $(echo "$datei" | awk '{print $6,$7,$8,$9,$1}')
echo "$jahr" "$monat" "$tag" "$dateiname" "$test"
done
robi
PS für die Bastler hier im Forum:
es gibt neben der
Bash aber noch andere Shells, die durchaus auch noch einige andere Umleitungs Methoden kennen, Erwähnen möche ich hier mal die
ksh (Kornshell).
Wer eine echte Kornshell installiert hat, kann ja mal das hier testen, und versuchen herauszufinden warum das mit der ksh funktioniert, aber nicht mit der Bash
Code:
#!/usr/bin/ksh
eingang="/tmp"
ls -lA "--time-style=+%Y %m %d " $eingang | awk '{print $6 , $7 , $8 , $9 , $1}' |&
echo "hier kann jetzt irgend was anderes gemacht werden"
while read -p jahr monat tag dateiname test
do
echo "$jahr" "$monat" "$tag" "$dateiname" "$test"
done