[Debian] Script mit Zahlen starten?

#uP.Chefchen

Cadet 2nd Year
Registriert
Nov. 2012
Beiträge
30
Bin die letzten Tage ein wenig daran ein kleines script unter debian zu schreiben.
Ich versuche das Script mit Zahlen als Argument zu starten.
Es soll darauf hinauslaufen, das es NUR mit Zahlen klappt.
Also z.B. "test.sh 1234"
Das ganze soll dann in einer Variable gespeichert werden.
Es soll an dieser Stelle nicht möglich sein, das Script ohne Zahlen auszuführen.
Es soll außerdem nicht möglich sein, Buchstaben zu nutzen.
Noch dazu, müssen es immer genau 4 Zahlen sein.

Also:
test.sh = Nicht OK
test.sh 123 = Nicht OK
test.sh 12b4 = Nicht OK

test.sh 1234 = OK

Leider habe ich absolut keine Ahnung wie ich das ganze als Abfrage hinbekomme.
Bis jetzt schaffe ich es nur, abzufragen das nur Zahlen vorhanden sind.
Wenn ich dann aber gar nichts anhänge, klappt es trotzdem.
Mit weniger oder mehr als 4 Zahlen natürlich erstrecht.
Ist vielleicht jemand hier, der sich mit dem ganzen ein wenig auskennt und mir helfen könnte?

Schonmal danke im vorraus.
 
Hallo uP.Chefchen

zunächst möchte ich mal sagen das ich kein bash guru bin daher sicher nicht die tollste lösung für dich parat hab. Dennoch hier die Möglichkeiten die mir so einfallen würden:

1) Genau 4 Parameter
Code:
if [[ "${#@}" != "4" ]]  # mit "$@" sprichst du alle Parameter an und durch das "#" wird die anzahl ausgegeben
then
    echo "Bitte genau vier (4) Zahlen als Parameter übergeben z.B. \"$ ./<Scrip-Name> 23 42 1337 5\""
    exit 1
fi

2) Nur Zahlen als Parameter
Code:
for parameter in "${@}"
do
    if [[ "$(echo "$parameter" | sed -e 's#[0-9]##g')" != "" ]] # mit dem sed befehl werden hier alle Zahlen aus dem Parameter entfernt er sollte also hinterher gleich einem leeren String sein, außer es wurden andere Zeichen verwendet, soll auch Komma oder Punkt zugelassen werden dann "[0-9,\.,\,]"
    then 
        echo "FEHLER: Parameter $parameter ist keine Zahl"
        echo "Bitte nur Zahlen als Parameter eingeben"
        exit 1
    fi
done


PS: kann man hier kein code block einfügen? Hab das jetzt über Schriftart gemacht.
--> Ok hat sich erledigt hatte nur den direkt Antworten Editor da gabs das nicht beim editieren öffnet sich ein anderer.
 
Zuletzt bearbeitet:
Moin Moin,

das hier sollte es tun.
Code:
if [[ ! "$@" =~ [0-9]{4} ]]; then
  echo "Usage:"
  echo "$0 1234"
  exit 1
fi
[...<dein code wenn 4 Ziffern übergeben wurden>...]
 
Danke! Hat mir sehr geholfen! :)

Nur mal so aus interesse, wo ist der unterschied zischen "$1" und "$@"? Ich habe bisher immer mit "$1" gearbeitet.
 
"$1" ist der erste übergebene positionale Parameter auf der Kommandozeile.

"$@" (oder "$*") sind alle übergebenen Parameter, als Worte jeweils in Anführungszeichen, und zwar ohne Interpretation. Das bedeutet, dass man die Menge der Parameter skriptintern als Array behandeln kann (aber nicht muss).

"$0" ist das Skript selbst, mit vollem Pfad.

Mehr findest du im Advanced Bash-Scripting Guide.
 
Zuletzt bearbeitet: (Kleiner Typo.)
Hallo derJD,

was genau bewirkt ein
Code:
=~
in einer test condition? Finde nirgends eine Beschreibung dazu.

Danke
 
Das bedeutet das der Vergleich mit einem Regulärem Ausdruck(Regular Expression bzw. kurz einfach regex) durchgeführt wird. Der von derJD genannte ist eben (wenn ich das jetzt grade noch richtig im Kopf habe, hab schon länger nichts mehr mit regex gemacht. :()

[0-9] (Zahl zwischen von 0 bis 9)
und das {4} dahinter steht dann für "entspricht genau vier mal"
 
Hi kartman,

der Operator sagt, dass extended regex verwendet werden soll.
"man bash" und dann nach "=~" suchen:
[...]

An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to
the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)). The
return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incor‐
rect, the conditional expression's return value is 2. If the shell option nocasematch is enabled, the match is performed
without regard to the case of alphabetic characters. Any part of the pattern may be quoted to force the quoted portion
to be matched as a string. Bracket expressions in regular expressions must be treated carefully, since normal quoting
characters lose their meanings between brackets. If the pattern is stored in a shell variable, quoting the variable
expansion forces the entire pattern to be matched as a string. Substrings matched by parenthesized subexpressions within
the regular expression are saved in the array variable BASH_REMATCH. The element of BASH_REMATCH with index 0 is the
portion of the string matching the entire regular expression. The element of BASH_REMATCH with index n is the portion of
the string matching the nth parenthesized subexpression.

[...]

Grob gesagt, mit dem "=="-Operator kann ich maximal nach *[0-9], also beliebig viele Ziffern, suchen.
http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

Mit dem "=~"-Operator, geht da schon mehr. In dem Link hat sich einer richtig ausgetobt:
http://www.itworld.com/operating-systems/355273/unix-bashs-regular-expressions

kartman schrieb:
Hallo derJD,

was genau bewirkt ein
Code:
=~
in einer test condition? Finde nirgends eine Beschreibung dazu.

Danke


Edit: Da war ich zu langsam mit meiner erklärung :D
 
Danke @Fonce & @derJD

hab natürlich nicht in der manpage von bash gesucht sondern in der von test -.- naja auf jeden fall sehr gut zu wissen
 
Zurück
Oben