ubuntuusers.de

Bash: Inhalt einer Variablen überprüfen

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Tronde Team-Icon

Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Hallo.

Ich stehe gerade ein wenig auf dem Schlauch und hoffe mir kann jemand helfen.

In einem Bash-Script wird ein C-Programm aufgerufen und schreibt seine Ausgabe als String in eine Variable.

1
DATEN=$(./C-Programm)

Normalerweise liefert das C-Programm einen String in der Form "22.0 78" zurück. Außer wenn ein Fehler auftritt. Dann steht "ERROR:..." in der Variablen. Nun möchte ich im weiteren Scriptverlauf in einer IF-Verzweigung prüfen, ob der String in der Variablen DATEN mit einer Zahl beginnt oder nicht. Wie kann ich das machen? ❓

MfG

Tronde

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17608

Wohnort: Berlin

Mit case/esac:

1
2
3
4
5
6
7
8
9
daten="22.0 78"
echo $daten 
22.0 78

case $daten in 
  [0-9]*) echo fein;; 
  *) echo uebel;; 
esac 
fein

Test für Strings die mit Zahlen beginnen oder nicht:

1
2
3
4
5
6
daten="a22.0"; case $daten in  [0-9]*) echo fein;;  *) echo uebel;;  esac 
uebel
daten="22f"; case $daten in  [0-9]*) echo fein;;  *) echo uebel;;  esac 
fein
daten="22,0f"; case $daten in  [0-9]*) echo fein;;  *) echo uebel;;  esac 
fein

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

1
2
3
4
5
6
7
8
9
#!/bin/bash

daten="0text"

if [ "${daten%%[[:digit:]]*}" = "" ]; then
 echo "Fängt mit Ziffer an"
 else
 echo "Fängt nicht mit Ziffer an"
 fi

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Normalerweise würde man die Fehlerbedingung abfragen, und nicht unbedingt die Ausgabe ...

Also ungefähr sowas:

1
2
3
4
daten=$(./C-Programm)
if [ $? -gt 0 ]; then echo Fehler
else echo $daten
fi

Das setzt natürlich voraus, dass das C- Programm auch einen Fehlerwert (> 0) zurückgibt ...

LG,

track

Tronde Team-Icon

(Themenstarter)
Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Hey und danke soweit für eure Antworten. Zur Antwort von TausB habe ich noch eine Frage. Kannst du mir erklären was der Test in der if-Verzweigung funktioniert? Leider verstehe ich nicht was da eigentlich passiert.

TausB schrieb:

1
2
3
4
5
6
7
8
9
#!/bin/bash

daten="0text"

if [ "${daten%%[[:digit:]]*}" = "" ]; then
 echo "Fängt mit Ziffer an"
 else
 echo "Fängt nicht mit Ziffer an"
 fi

MfG

Tronde

TausB

Avatar von TausB

Anmeldungsdatum:
26. November 2009

Beiträge: 1570

Wohnort: Terra incognita

Tronde schrieb:

Kannst du mir erklären was der Test in der if-Verzweigung funktioniert?

Ich versuche es. 😉

Stichwort: parameter expansion

Ich beschreibe einmal in Worten:
Nimm die Variable "daten" und entferne von rechts "%" soviel Du kannst "%%", was dem Suchmuster entspricht. Das Suchmuster ist Ziffer "[[:digit:]]" und danach irgendetwas "*". Das vergleiche mit einem leeren String = "".

Fängt der String mit einer Ziffer an, wird folglich alles entfernt und der String ist leer.

Daher ist die Fehlerquelle: Sollte "daten" leer sein, wird das quasi als Ziffer gewertet. Das könnte/sollte man aber vorher abfangen.

Grüße
TausB

Tronde Team-Icon

(Themenstarter)
Avatar von Tronde

Anmeldungsdatum:
23. November 2006

Beiträge: 1640

Danke für die Erklärung. Damit habe ich es auch verstanden. 👍

Antworten |