Hilfe in Bash-Programmierung

E

exponator

Grünschnabel
Hallo,
Bin Neuling was der Shellprogrammierung anbelangt.
Gibt es eine Möglichkeit in einem Bash-Script einen Goto-Befehl nachzubilden?
Ich habe mir das Thread http://www.unixboard.de/vb3/showthread.php?t=1853 angesehen. Aber das erfüllt nicht so recht meinem Wunsch, weil der Zahlenbereich einfach zu groß ist.

Ich habe folgendes im Script computer stehen:
Code:
CompNameA="pc"
echo -n "Computername: pc"; read CompName
if [ -z $CompName ]
  then echo "Du hast keinen Computernamen eingegeben."; sleep 2; sh ./computer
fi
if [ "${#CompName}" != 3 ]
  then echo "Es wird eine 3-stellige Eingabe verlangt."; sleep 2; sh ./computer
fi
case $CompName in
	100) echo "Diesen Computernamen kannst Du nicht verwenden."; sleep 2; sh ./computer;;
	101) echo "Diesen Computernamen kannst Du nicht verwenden."; sleep 2; sh ./computer;;
	102) echo "Diesen Computernamen kannst Du nicht verwenden."; sleep 2; sh ./computer;;
	103) echo "Diesen Computernamen kannst Du nicht verwenden."; sleep 2; sh ./computer;;
	  *) echo "Ihre Angabe: pc"$CompName;;
esac
echo -n "Angabe korrekt? ";
while true
do
        read  JN
        case "$JN" in
        n)  sh ./computer;;
        N)  sh ./computer;;
        *) IPEz=$CompName; $CompName=$CompName01&&$CompName ;;
        esac
done
...

Man soll hier einen Computernamen eingeben, der auf einer IP-Endziffer basiert.
Zum Beispiel: 089. Unbedingt 3-stellig.
Daraus entsteht die Variable $CompName = 089.
Wird Enter gedrückt oder nicht 3-stellig eingegeben, wird das Programm neu gestartet.
Bisher fiel mir nicht anderes ein, als bei einer Falscheingabe das Script immer wieder neu starten zu lassen.
Besser wäre natürlich die Möglichkeit, mit leerem Feld zur Eingabe zurückzuspringen.

1. Wie weise ich der Variablen $IPEz (IPEndziffer) den Wert der Variablen $CompName zu?
2. Wie füge ich die Variablen $CompNameA und $CompName zusammen, um daraus die neue Variable $CompName zu bilden?
3. Wie klaue ich zu guter Letzt der $IPEz, wenn die IP unter 100 bzw. unter 10 liegt, die anführende 0?

Ich kannte bislang nur die Basic-Programmierung eines C64. Da gings einfacher.

Kann mir trotzdem jemand helfen?

---
thanks
exponator
 
Hallo
Bau dir für die Eingabe eine Funktion, die sich im Fehlerfall selbst nochmal aufruft.

Gruß Wolfgang
 
Wolfgang schrieb:
Hallo
Bau dir für die Eingabe eine Funktion, die sich im Fehlerfall selbst nochmal aufruft.
Gruß Wolfgang
Hi Wolfgang,
tut mir leid, das ich mich nicht auskenne.
Aber wie soll sowas aussehen?
Ich habs noch nie gemacht.
Alle Google- und Boardsuchen ergaben keinen Erfolg.

---
Gruß
exponator

Ach was wäre es doch schön, kenne man sich doch nur aus.
 
Einlesen kannst du per read $FOO.
Für die Wiederholung stellst du einfach eine Bedingung auf, if.

MFG

Dennis
 
Moin,

Code:
function lese_input() {
echo -n "Computername: pc"; read CompName
test -z $CompName && \
( echo "Du hast keinen Computernamen eingegeben."; sleep 2; lese_input ; )
}

function check_input() {
if [ "${#CompName}" != 3 ]
  then echo "Es wird eine 3-stellige Eingabe verlangt."; sleep 2; lese_input ;
fi

case $CompName in
	100|101|102|103) echo "Diesen Computernamen kannst Du nicht verwenden."; sleep 2; lese_input ;;
	  *) echo "Ihre Angabe: pc"$CompName;;
esac

echo -n "Angabe korrekt? "; read JN

case "$JN" in
        N|n) lese_input;;
        *) IPEz=$CompName; $CompName=$CompName01&&$CompName ;;
esac
}

sync
 
Hi phrenicus,
so einfach geht das? Vielen vielen Dank dafür.
Aber wie springt man wieder zur Eingabe zurück?
So wie:
Eingabe erfolgt am Bildschirm in Zeile 20.
Keine IP eingegeben erfolgt Meldung.
Nach 2 Sekunden erlischt die Meldung und springe zur Eingabe in Zeile 20 zurück.

Aber ich komme auch schon ein großes Stück voran.
Ich habe allerdings die Richtung geändert.
Es muss nun nicht der CompName sondern die IPEz (IP-Endziffer) angegeben werden.
Grund: Es werden NUR noch Computer beginnend mit pc (z.B.: pc098) in die Domaene eingegliedert. Es kann niemand einen Computer mit anderem Namen, wie z.B. Uranus eingliedern.
Die andere Möglichkeit wäre eine Abfrage ob die Eingabe ein numerischer String ist. Wenn nicht,, mache Meldung.

Muss jetzt auch noch für den Nameserver und diverse Dateien, in denen die IP des Rechners eingefügt wird, wissen, wie ich evtl. anführende Nullen abschneide. Das müsste ich doch mittels test oder if hinbekommen.

Habe zwar schon was in der Richtung gefunden, scheint aber noch nicht das richtige zu sein. Es fehlt noch die Abfrage, ob es überhaupt Nullen am Anfang des Strings IPEz gibt.
Gefunden habe ich
"basename {string} {suffix}" oder auch cut -c {Zeichen}.
Nur, wie handhaben.
Gedacht hatte ich mir das so:
Der User gibt nun eine 3-stellige Zahl ein. (Funktioniert auch schon)
Es wird geprüft, ob der PC bereits im System existiert. (Funktioniert auch schon)

Und morgen geht 's weiter.
Bis dahin.

cu
exponator
 
Hallo
Um aus einer Variablen die führenden Nullen zu entfernen, kannst du verschiedene Mechanismen nutzen.
ein schnelles Beispiel mit sed

Code:
read a
b=$(echo $a|sed -e '/^[0-9]*$/!d;s/^0*//g'); 
if [ -n "$b" ]; 
then 
echo $b; 
else 
echo "Eingabe enthält unerlaubte Zeichen";

fi

HTH
Gruß Wolfgang
 
Hi Wolfgang,
was ist das?
Wolfgang schrieb:
...ein schnelles Beispiel mit sed
Code:
read a 
b=$(echo $a|sed -e '/^[0-9]*$/!d;s/^0*//g');
Was passiert denn hier mit den ganzen Zeichen?
Soviele Zeichen kann sich doch ein Anfänger gar nicht merken.
Könntest Du mir das bitte kurzerhand zerpflückend erklären?
Ich möchte es ja gern verstehen.
Aber Goggle, Wikipedia, Linux Kompendium und Konsorten spucken es nicht aus.

Bis " sed -e'/^ " hab ichs noch hinbekommen.
^-Zeichen steht für den Anfang eines Strings.

thanks
exponator
 
Zuletzt bearbeitet:
Hallo exponator,

exponator schrieb:
Hi phrenicus,
so einfach geht das? Vielen vielen Dank dafür.
Aber wie springt man wieder zur Eingabe zurück?
So wie:
Eingabe erfolgt am Bildschirm in Zeile 20.
Keine IP eingegeben erfolgt Meldung.
Nach 2 Sekunden erlischt die Meldung und springe zur Eingabe in Zeile 20 zurück.

Gar nicht. Es geht so:

Funktion lese_input (Zeile völlig egal)
Keine IP eingegeben erfolgt Meldung.
Nach 2 Sekunden erlischt die Meldung und springe zur Funktion lese_input zurück.

Verstanden?

Gruß
 

Ähnliche Themen

Hilfe für ein shell script

script sshpass

continue in Schleife einbauen

verzeichniss suche funktioniert nicht

bash esac problem

Zurück
Oben