• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Variable in case-Fall klappt nicht

dukenuker

Newbie
Hallo zusammen,
folgender Beispiel-Code:
Code:
#!/bin/sh

LETTER="B"
ABC="A | B | C"

case $LETTER in
	$ABC)		echo "Das hier soll ausgeben werden!"
			;;
	A | B | C)	echo "Das wird aber ausgegeben"
			;;
	*)		echo "Geben Sie A, B oder C an"
			;;
esac
Folgendes Problem: ich will, dass die Ausgabe des ersten case-Falls ausgegebeb wird, es wird aber immer nur die Ausgabe des zweiten Falls ausgegeben. Wie kann ich die Variable $ABC aus dem ersten Fall richtig auflösen lassen?

Grüße -und Danke,
Simon
 
:? Ähhh, was genau willst du denn mit der ersten case-Anweisung ($ABC) ...) bezwecken?
Die Zweite gilt für A ODER B ODER C, die dritte Anweisung deckt alle anderen Fälle ab.

Btw: Wozu braucht es dazu eine Umfrage?
 

abgdf

Guru
Mir scheint, Du denkst eher in Python als in sh :p :

Code:
#!/usr/bin/env python

LETTER = "B"
ABC = "A | B | C"

if LETTER in ABC and LETTER != "A | B | C":
    print "Das hier soll ausgeben werden!"

elif LETTER == "A | B | C":
    print "Das wird aber ausgegeben."

else:
    LETTER = raw_input("Geben Sie A, B oder C an: ")

(Habe keinen IT-Beruf.)

Viele Grüße
 
OP
dukenuker

dukenuker

Newbie
Ich glaube, die Frage wurde nicht richtig verstanden. Die Beispielvariable $ABC brauche ich mehrmals in meinem Skript. D.h. ich initialisiere sie am Skriptanfang, um sie dann mehrmals wieder verwenden zu können.
Die Bedingung vom. 2. case-Fall ist genau das gleiche wie er Inhalt der Variablen $ABC. Aber aus irgendeinem Grund kann ich die Variable im 1. case-Fall nicht richtig auflösen.
 

panamajo

Guru
dukenuker schrieb:
Die Bedingung vom. 2. case-Fall ist genau das gleiche wie er Inhalt der Variablen $ABC. Aber aus irgendeinem Grund kann ich die Variable im 1. case-Fall nicht richtig auflösen.

IIRC lässt sh bzw. bash keine Variablen als Selektor zu, nur Konstanten (wie auch die Wirth'schen Sprachen Pascal, Modula123).
 
OP
dukenuker

dukenuker

Newbie
Ich habs jetzt so gemacht:
Code:
#!/bin/sh

LETTER="B"
ABC="A B C"

for ELEM in $ABC; do
	case $LETTER in
		$ELEM)		echo "Der angegebene Buchstabe ist in \$ABC enthalten"
				       ;;
		*)		      echo "Bitte geben Sie A, B oder C an"
				       ;;
	esac
done

Verbesserungsvorschlägen gerne erwünscht!

Grüße,
Simon
 
OP
dukenuker

dukenuker

Newbie
abgdf schrieb:
Ich glaube, die Frage wurde nicht richtig verstanden.

Dann erklär sie besser. Wir wissen immer noch nicht, was Dein Skript überhaupt machen soll.

Wer lesen kann, ist im Vorteil: das habeich doch in meinem zweiten Post geschrieben.

Ich will nicht schreiben müssen:

Code:
case LETTER in
   A | B | C)      echo "Der Buchstabe $LETTER ist A, B  oder C"
                        ;;
   *)                  echo "Bitte geben Sie A, B  oder C an"
                        ;;
esac

sondern

Code:
case LETTER in
   $ABC)          echo "Der Buchstabe $LETTER ist A, B  oder C"
                        ;;
   *)                  echo "Bitte geben Sie A, B  oder C an"
                        ;;
esac

Somit kann ich die Abprüfbedingung ganz leicht am Anfang des Skriptes festlegen, ohne dass später noch in der case-Anweisung herumgepfuscht werden muss. Das hier ist nur ein vereinfachtes Beispielskript, ich wollte nicht das genze Skript posten, weil der Sinn der Gleiche bleibt.

Aber wie gesagt das Problem ist gelöst, außer jemand findet noch eine bessere Lösung.

Grüße,
Simon
 

abgdf

Guru
das habeich doch in meinem zweiten Post geschrieben.

Auch in Deinem zweiten Post ist nur von case / "ABC" usw. die Rede. Ich wollte aber wissen, wozu Du Dein Skript überhaupt brauchst, das heißt, welche Aufgabe Du damit lösen wolltest (also z.B. alle Dateien, die "A" enthalten kopieren oder so).
 
Ich habe mir erlaubt diese Sinnlos-Umfrage zu löschen, da es fürchterlich sch**ßegal ist was oder wer jemand ist der hilft ein Problem zu lösen.
 
Oben