fehlerhafte usereingabe mit case abfangen?

Status
Für weitere Antworten geschlossen.
tuxlover

tuxlover

Der den Tux knuddelt
hallo ich möchte folgendes machen:

der user meines shellscripts soll als parameter einen dateipfad an das script übergeben. dabei soll beachtet werden, dass dateipfade mit / anfangen und keine sonderzeichen enthelten. ich habe mir nun folgende case anweisung überlegt, weiß aber nicht, wie ich einen NOT operator einbaue.

Code:
#!/bin/bash

VAR="notvalid"
read -p "enter path:"
$(VAR:="notvalid") 2> /dev/null
CHECKER=`echo $VAR | cut  -c -1 ` 

#sollte bei gültigen eingaben / am anfang haben^^

case "$CHECKER" in
notvalid) echo "not a valid pathname script stopped" && exit 1 
##fängt die leere eingabe ab^^ 
esac

sonst noch jemand ne idee

vielen dank

gruß tuxlover
 
Zuletzt bearbeitet:
Hallo
Da du offensichtlich die Bash nutzt, zunächst folgendes zu deinem Scriptversuch.
as dürfte zumindest so nicht durchlaufen:
Siehe die fett markierten Stellen.
Code:
#!/bin/bash

VAR="notvalid"
read -p "enter path:"
[b]$(VAR:="notvalid") 2> /dev/null[/b]
[b]CHECKER:=`echo $VAR | cut  -c -1 ` [/b]

#sollte bei gültigen eingaben / am anfang haben^^

case "$CHECKER" in
notvalid) [b]echo "not a valid pathname script stopped" && exit 1 [/b]
##fängt die leere eingabe ab^^ 
esac

sonst noch jemand ne idee

vielen dank

gruß tuxlover

Wenn du die Variablenexpansion nutzen willst, schau dir das nochmal an in der Manpage von bash:
${parameter:-word}
Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise, the
value of parameter is substituted.
${parameter:=word}
Assign Default Values. If parameter is unset or null, the expansion of word is assigned to parameter.
The value of parameter is then substituted. Positional parameters and special parameters may not be
assigned to in this way.
${parameter:?word}
Display Error if Null or Unset. If parameter is null or unset, the expansion of word (or a message to
that effect if word is not present) is written to the standard error and the shell, if it is not interac‐
tive, exits. Otherwise, the value of parameter is substituted.
${parameter:+word}
Use Alternate Value. If parameter is null or unset, nothing is substituted, otherwise the expansion of
word is substituted.
${parameter:offset}
${parameter:offset:length}
Substring Expansion. Expands to up to length characters of parameter starting at the character specified
by offset. If length is omitted, expands to the substring of parameter starting at the character speci‐
fied by offset. length and offset are arithmetic expressions (see ARITHMETIC EVALUATION below). length
must evaluate to a number greater than or equal to zero. If offset evaluates to a number less than zero,
the value is used as an offset from the end of the value of parameter. Arithmetic expressions starting
with a - must be separated by whitespace from the preceding : to be distinguished from the Use Default
Values expansion. If parameter is @, the result is length positional parameters beginning at offset. If
parameter is an array name indexed by @ or *, the result is the length members of the array beginning with
${parameter[offset]}. A negative offset is taken relative to one greater than the maximum index of the
specified array. Note that a negative offset must be separated from the colon by at least one space to
avoid being confused with the :- expansion. Substring indexing is zero-based unless the positional param‐
eters are used, in which case the indexing starts at 1.

...

$(command) führt ein Commando aus, was $(VAR:="notvalid") definitiv nicht ist.
Meintest du eventuell ${VAR:=fuubar}? Man achte auf die verwendete Klammerart!
Die Backtiks sind eigentlich auch deprecated besser $(command);

Interessant wäre für dich wahrscheinlich auch ${parameter:offset:length}.
Weiterhin endet bei case jedes Command mit doppeltem ;; (Semikolon)

Ein Tipp zum Schluss:
Warum willst du das mit case erschlagen, zumal du wahrscheinlich auch noch die Existenz des Pfades und ob er lesbar istusw.prüfen musst.

Hier eignet sich Test (aka if) wirklich besser.

Case ist nur geeignet, auf pattern zu testen.
Code:
case $VAR in
[!A]*) echo "Beginnt nicht mit A";;
...

So nun viel Spaß beim Einlesen in die genannten Dinge.

Gruß Wolfgang
 
ja hast recht bei mir ist es auch i n {} geklammert. habe jetzt nur keine möglichkeit dass nachzuschauen.


was ist denn an der zeile falsch?

CHECKER:=`echo $VAR | cut -c -1 `

naja ich kann mich nicht mehr richtitg erinnern, wie ich das gemacht habe. aber meine idee war die, dass wenn alles bis auf den ersten char abgeschnitten wird und wenn dann in case eingelesn kein / ist, dass programm abbricht.

aber das ist nicht so schön, weil es ja noch keine * oder andere sonderzeichen von der ausgabe ausschließt.

vlt hat jemand eine bessere idee
 
Hallo
Hast du das mal getestet?
Mit Sicherheit nicht!
VAR=5;
CHECKER:=$(echo $VAR );
bash CHECKER:=5 command not found

DU solltest dir mal ansehen, wie eine Wertzuweisung unter bash funktioniert.
Das ist allenfalls pascal, aber keine Bashsyntax. ;)

Gruß Wolfgang
 
doch mit sicherheit habe ich das getestet und außerdem steht das kommando in ``, falls du dieses detail übersehen haben solltest.

wie schon gesagt, es kann sein, dass es nicht ganz stimmt. aber das war auch nicht meine frage. meine frage zum code bezog sich auf den case. alles andere funktioniert bei mir. :)

bei der wertzuweiseung kann ich mir nicht alles merken. weshalb ich es zuhause auf ein zettel geschrieben habe. schön ordentlcih mit selbst durchprobierten beispielen. hehe ;)

kann mir z.b. das ganze mit einer schleife abfangen???
 
Zuletzt bearbeitet:
doch mit sicherheit habe ich das getestet und außerdem steht das kommando in ``, falls du dieses detail übersehen haben solltest.

wie schon gesagt, es kann sein, dass es nicht ganz stimmt. aber das war auch nicht meine frage. meine frage zum code bezog sich auf den case. alles andere funktioniert bei mir.

kann mir z.b. das ganze mit einer schleife abfangen???

Hallo Nochmal $() ist die neue Version und sollte heute immer statt ´ ´ verwendet werden. (falls dir mein erster Beitrag nicht aufgefallen ist)
;)
Hat mit dem Fehler auch nix zu tun!
Eine Zuweisung unter bash :
VARNAME=WERT
Da steht kein Doppelpunkt.
In welcher Bash hast du das getestet?

Zur case habe ich dir schon geantwortet.
Aber möglicherweise magst du meinen Beitrag garnicht lesen.
Es hat zumindest für mich den Anschein.

Dann kann ich mir das auch sparen.

Wolfgang
Nachtrag
Code:
VAR="*ABCD";
case  "$VAR" in [!A]*) echo "nicht A";;
esac
nicht A
Funktioniert problemlos auch mit *.
 
Zuletzt bearbeitet:
Ich empfehle die Lektüre von man bash und man grep.
 
ja der doppelpunkt ist ein tippfehler. sry. habs berichtigt.

so nun bin ich aber völlig verwirrt. warum nun mit
VARNAME=$() und nicht VARNAME=`` wo ist denn der unterschied.

@xanti wieso grep? man bash: nö denke ich gar nicht dran. viel zu durcheinander was da steht. zum lernen nicht geeignet. ich lese das abs von der linux howto website und das von der schatenseite und ein paar andere.
 
ja der doppelpunkt ist ein tippfehler. sry. habs berichtigt.

so nun bin ich aber völlig verwirrt. warum nun mit
VARNAME=$() und nicht VARNAME=`` wo ist denn der unterschied.

@xanti wieso grep? man bash: nö denke ich gar nicht dran. viel zu durcheinander was da steht. zum lernen nicht geeignet. ich lese das abs von der linux howto website und das von der schatenseite und ein paar andere.

$() ersetzt `` wegen der vermeidbaren Verwechslung.
Dass das nix mit dem Fehler zu tun hat sagte ich schon.

Wenn du die Manpage für überflüssig hältst, warum sollte dir dann jemand sein Wissen weitergeben wollen, der sich die Mühe gemacht hat.

Hast du dir das mal überlegt?

Kopfschüttelnd abtretend
Wolfgang
 
ich halte die manpage im allgemeinen nicht für überflüssig. ich habe damit schon oft dinge nach geschaut.
okay verstehe jetzt den hinweis auf grep. damit kann ich ja dann nach stichpunkten forschen. alles klar.
ich wollte nur vermeiden, dass mir jemand vorwirft ich sei zu faul die etwas zu lesen.
 
...

@xanti wieso grep? man bash: nö denke ich gar nicht dran. viel zu durcheinander was da steht. zum lernen nicht geeignet. ich lese das abs von der linux howto website und das von der schatenseite und ein paar andere.

Mit grep und speziell dessen Möglichkeit, reguläre Ausdrücke verarbeiten zu können, lässt sich relativ leicht der Pfad auf Gültigkeit prüfen lassen.

Deine Aversion gegen Man-Pages ist Dein Problem. Diese Man-Pages sind auch nicht zum Lernen gedacht, sondern zum Nachschlagen. Da Du Dein Wissen lieber aus veralteten Howtos beziehst, hättest Du zumindest Wolfgangs Hinweise nachschlagen können. Dies hätte Dir einige peinliche Kommentare ersparen können.

Alles, was ich erkenne, ist Lernresistenz -> Closed.
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.

Ähnliche Themen

Arch Autoinstallscript

JSVC Berechtigungsproblem

Image Resizer

Samba Update von 3.2.5 auf 3.5.6 - Probleme beim Server Browsen

iptables weiterleitung port vom internen Netzwerk zum internet Port

Zurück
Oben