Ich schreibe ein Skript, das Benutzereingaben liest und sie mithilfe von in Felder aufteilt awk
. Ich möchte eines dieser Felder am Ende des Skripts verwenden und versuche daher, es in einer Variablen zu speichern, aber vergeblich.
awk
Eine mögliche Lösung besteht darin, die Eingabe zu speichern und sie am Ende erneut zu verarbeiten , aber ich habe mich gefragt, ob es eine Möglichkeit gibt, bereits verarbeitete Informationen in einer Variablen beizubehalten.
Zum Beispiel,
read -p "Enter args: "; echo -n $REPLY | awk '{ \*Do some stuff with fields*\; nth=$3}'
# More script
echo "Your 3rd argument was $nth"
aber oben funktioniert es nicht. nth
ist am Ende leer (was bedeutet, dass es lokal für awk
? war).
TIA
Antwort1
Ich bin nicht sicher, warum Sie awk benötigen, aber Sie können das -a
Flag hinzufügen, read
damit Sie ein Array erhalten. Vorausgesetzt, die Felder/Spalten, von denen Sie sprechen, sind durch ein Leerzeichen begrenzt/getrennt.
read -rp "Enter args: " -a input
printf 'Your 3rd argument was %s\n' "${input[2]}"
- Denken Sie daran, dass Bash-Arrays beim Index Null beginnen.
Sie können die Eingabe in einer Schleife durchlaufen.
read -rp "Enter args: " -a input
for ((i=0; i<${#input[@]}; i++)); do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
Oder so
read -rp "Enter args: " -a input
for i in "${!input[@]}"; do
printf 'Your %d argument was %s\n' "$i" "${input[$i]}"
done
Aber Folgendes würde ich mit awk tun.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $3}' <<< "$REPLY")
printf 'Your 3rd argument was %s\n' "$nth"
Speichern von zwei Feldern, dem 2. und 3., in nur einem Variablennamen.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'The argument was %s\n' "$nth"
Wenn Sie das 2. und 3. Feld in einem anderen Variablennamen aufteilen möchten.
read -rp "Enter args: "
nth=$(awk '{\*Do some stuff with fields*\; print $2, $3}' <<< "$REPLY")
printf 'Your 2nd argument was %s\nYour 3rd argument was %s\n' "${nth#* }" "${nth% *}"
- Die
"${nth#* }"
und"${nth% *}"
können mit einer separaten Variable gespeichert werden.
Eine weitere Antwort hierzu ist awk
das Drucken aller Felder mit $0
und read
was mich zu meiner ersten Antwort zurückbringt mitread -ra
read -rp "Enter args: "
read -ra fields < <(awk '{\*Do some stuff with fields*\;print $0}' < <(printf '%s' "$REPLY"))
Alle Felder ausdrucken
printf '%s\n' "${fields[@]}"
- Mein erster Beitrag/meine erste Antwort auf diese Frage zeigt, wie man durch die Felder von Bash-Arrays schleift und wie diese auch indiziert werden.