Bash: Teilausgabe eines Befehls in Variable

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MaVe
Beiträge: 3
Registriert: 31.01.2009 17:18:38

Bash: Teilausgabe eines Befehls in Variable

Beitrag von MaVe » 24.07.2009 01:06:33

Hallo,

ich arbeite gerade an einem Bash-Script, welches (wenn es fertig ist) einen bestimmten Befehl ausführt und einen Teil der Ausgabe in einer Variable speichert.

Die Ausgabe sieht so aus:

Code: Alles auswählen

Updated to revision 1234.
1234 ist dabei die Zahl, die ich in der Variable speichern will.
Nur wie stelle ich das ganze an? Bisher habe ich es nur soweit geschafft, den Befehl auszuführen ;)


MFG
MaVe

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: Bash: Teilausgabe eines Befehls in Variable

Beitrag von SubOptimal » 24.07.2009 01:30:38

Hi MaVe,
MaVe hat geschrieben:ich arbeite gerade an einem Bash-Script, welches (wenn es fertig ist) einen bestimmten Befehl ausführt und einen Teil der Ausgabe in einer Variable speichert.

Die Ausgabe sieht so aus:

Code: Alles auswählen

Updated to revision 1234.
1234 ist dabei die Zahl, die ich in der Variable speichern will.
Wie immer gibt es mehrere Möglichkeiten. ;-)

Wenn Du die Zahl direkt aus der Ausgabe des Befehls extrahieren willst, dann z.B. so

Code: Alles auswählen

#!/bin/bash
var1=`echo "Updated to revision 1234" | cut -d " " -f 4`
echo "variable 1: $var1"
Die Ausgabe mit echo steht hier stellvertretend für den Befehl, der die Ausgabe erzeugt.

Wenn Du die Zeichenkette bereits in einer Variablen gespeichert hast, dann z.B. so

Code: Alles auswählen

#!/bin/bash 
var2="Updated to revision 1234"
var3=${var2##*revision }
echo "variable 3: $var3"
Es kann auch sein, daß eine ganz andere Möglichkeit besser geeignet wäre. Das hängt halt von Deinem speziellen Fall ab.

SubOptimal

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash: Teilausgabe eines Befehls in Variable

Beitrag von ThorstenS » 24.07.2009 01:35:46

Das schaut mir nach einer SVN Version aus. Ich benutze folgendes in einem Script:

Code: Alles auswählen

SVNVER=$(svn info https://svn.domain.tld/svn/trunk | awk '/^Revision/ {print $2}')
Du könntest aber auch das hier tun:

Code: Alles auswählen

VersionString=$(dein Befehl)  # <-- das gibt aus Updated to revision 1234.
Revision=$(echo ${VersionString#*revision} | tr -d .)

Methusalix

Re: Bash: Teilausgabe eines Befehls in Variable

Beitrag von Methusalix » 24.07.2009 01:39:50

Hallo,

Code: Alles auswählen

matthias@lenny:~$ echo "Updated to revision 1234" > ausgabedatei
matthias@lenny:~$ teilstring=`cat ausgabedatei | awk '{ print $4 }'`
matthias@lenny:~$ echo $teilstring
1234

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Bash: Teilausgabe eines Befehls in Variable

Beitrag von detix » 24.07.2009 11:07:29

Noch ne Möglichkeit ist "sourcing":
var_hierdrin (script mit der/den Variablen)

Code: Alles auswählen

#!/bin/sh
VAR='variable'
VAR2='variable2'
var_holen (script zum Holen der Variablen)

Code: Alles auswählen

#!/bin/sh
. var_hierdrin
echo $VAR
echo $VAR2
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Bash: Teilausgabe eines Befehls in Variable

Beitrag von ThorstenS » 24.07.2009 11:08:59

Matthias-GE hat geschrieben:

Code: Alles auswählen

matthias@lenny:~$ teilstring=`cat ausgabedatei | awk '{ print $4 }'`
Den cat kannst du dir sparen, weil awk selbst aus Dateien lesen kann. also so:

Code: Alles auswählen

teilstring=`awk '{ print $4 }' ausgabedatei`
Eine weitere Verbesserung ist, dass man unter der bash nicht die backticks, sondern das folgende $()Konstrukt benutzen kann:

Code: Alles auswählen

teilstring=$(awk '{ print $4 }' ausgabedatei)
Der grosse Vorteil ist, dass ich sowas tun kann

Code: Alles auswählen

$(Befehl1NutztErgebnisAus $(demBefehl2))
Backticks lassen eine solche Verschachtelung nicht zu. Wenn du also nur unter Linux unterwegs bist und dort die bash benutzt, nimm lieber $() - das lässt sich in vielen Editoren ausserdem besser lesen, weil die zusammenhängenden Klammern hervorgehoben werden können.

Antworten