Shell Script - User eingabe

_tnt_

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
485
Hallo,
bin gerade dabei das ich mir ein Shell Script schreibe. Jetzt komme ich aber nicht weiter.

Ich möchte einen Befehl ausführen lassen. Weiters möchte ich, wenn der User "--help" eingibt, dass ein paar Infos kommen z.B. die Version des Scripts, Ersteller etc.

Code:
#!/bin/bash

echo "If you need Help write >> --help"
read help
if ["$help" == "--help"]
        then echo "V01.01"


Da kommt dann aber nur "syntax error: unexpected end of file".


_tnt_
 
heist es auch nicht than ?
 
Code:
#!/bin/bash

echo "If you need Help write >> --help"
read help
if ["$help" == "--help"]
        then echo "V01.01"
fi



jetzt bekomme ich den fehler: line 5: [--help: command not found
 
[ ist ein Programm und deshalb muss dahinter ein Leerzeichen.

Code:
if [ "$help" == "--help" ]; then
[...]
fi

Außerdem sind die Anführungszeichen beim letzten echo überflüssig.
 
Zuletzt bearbeitet:
vielen dank - jetzt geht es.

3 Fragen:
1 - was meinst du mit "[ ist ein Programm und deshalb muss dahinter ein Leerzeichen"
2 - warum hast du am Ende der if einen ";" gesetzt - bei mir funktioniert es auch ohne.
3 - warum sind beim zweiten echo die "" überflüssig? dachte die brauche ich bei jedem echo.

_tnt_
 
if ... ; then ...

ist das selbe wie
if ...
then ...
 
1 - was meinst du mit "[ ist ein Programm und deshalb muss dahinter ein Leerzeichen"
Damit meine ich, dass ein Programm mit seinem Namen aufgerufen werden muss.
Wenn man zwischen dem Namen des Programmes und seinem ersten Parameter kein Leerzeichen setzt, weiß die Shell nicht, was du von ihr willst.
2 - warum hast du am Ende der if einen ";" gesetzt - bei mir funktioniert es auch ohne.
Mit den ; trennt man den Aufruf von [ von der nächsten Anweisung (then). Wenn man then in die nächste Zeile setzt, benötigt man das nicht. Ich finde es halt schöner so.
3 - warum sind beim zweiten echo die "" überflüssig? dachte die brauche ich bei jedem echo.
Weil beim zweiten Aufruf von echo keine Zeichenfolgen vorkommen, die die Shell speziell interpretiert (wie ">>" ganz oben).
 
Zuletzt bearbeitet:
mit [ ist ein programm ist das hier gemeint:

/usr/bin/[

das [ ist ein ausführbares kommando, _kein_ spezielles syntaxzeichen.

bash implementiert es aber soweit ich weiss direkt als buildin und verwendet nicht die externe binary - aus geschwindigkeitsgründen.

übrigens ist
if [ ... ]; then
identisch mit
if test ... ; then


dass du beim echo "" verwendest macht gar nichts. lieber unnötig verwenden als an der falschen stelle vergessen. bei echo würde es zwar nichts ausmachen,
aber bei anderen commands sehr wohl:

rm delete this
und
rm "delete this"
sind zwei völlig verschiedene dinge.

insofern ist es schon von vorteil wenn du dir angewöhnst alle argumente zu quoten, selbst wenns nicht nötig wäre.
 
Zuletzt bearbeitet:
Ich wollte nur noch mal ergänzen, dass [ nur ein symbolischer Link zum Programm test ist. Darum ist beides identisch.

Ich persönlich würde aber ein Shellskript nie so schreiben, dass das Skript direkt Eingaben vom Benutzer erwartet, sondern dass die Eingaben per Parameter an das Skript weitergereicht werden und Eingaben abfragt, wenns auch wirklich nötig tut (z.B. Sicherheitsabfragen).
Ein Shellskript, was letzendlich auf das Kommando vom Benutzer wartet, ist nicht grad Anwenderfreundlich.

Es macht doch kein Sinn, ein Skript zu starten, wo ich dann während des Skriptes eingeben muss, was das Skript überhaupt tun soll. Das wäre ja so, als würde ich cd eingeben und Enter drücken und erst dann gefragt werde, in welches Verzeichnis ich wechseln möchte.
 
Zuletzt bearbeitet:
dank!
 
so jungs habe nochmals ne frage, ich möchte eine funktion, welche mir alle files in meinen unterverzeichnis anzeigt (ausgehend vom aktuellen).

dabei sollen aber als suchkriterium die rechte der datein angegeben werden können.
4 möglichkeiten --> r, w, x, rw

so sieht mein code bis jetzt aus:

1) was hat es mit dem -e beim echo aufsich? ohne dem kann ich kein \n ausgeben.
2) wie kann ich " ls -l" so umändern, dass mir keine ordner angezeigt werden "also ohne d" und das ich noch eine der 4 rechte angeben kann.

Code:
#!/bin/bash

while [ 1 ]; do

echo -e "\n"

echo ">>> MENU <<<"
echo "------------"

echo -e "\n"

echo "1) start_dir      - Search Function"

echo "2) --help - If you need help"

echo "3) strg + c       - To quit"

echo -e "\n"

read todo
if [ "$todo" == "--help" ]
        then
        echo -e "\n"
        echo "V01.01"
fi

if [ "$todo" == "start_dir" ]
        then
        echo -e "\n"
        ls -lR
        # ls -lR | grep "^-"
fi

done


lg
_tnt_
 
Zuletzt bearbeitet:
_tnt_ schrieb:
1) was hat es mit dem -e beim echo aufsich? ohne dem kann ich kein \n ausgeben.
Die Manpages sind dir bekannt, oder?
-e enable interpretation of backslash escapes

[...]

If -e is in effect, the following sequences are recognized:

\0NNN the character whose ASCII code is NNN (octal)

\\ backslash

\a alert (BEL)

\b backspace

\c suppress trailing newline

\f form feed

\n new line

\r carriage return

\t horizontal tab

\v vertical tab

_tnt_ schrieb:
2) wie kann ich " ls -l" so umändern, dass mir keine ordner angezeigt werden "also ohne d" und das ich noch eine der 4 rechte angeben kann.
Du kennst Pipes, du kennst grep. Dann sollte es doch nicht mehr so schwer sein.
ls -l | grep -v '^d'
 
Zuletzt bearbeitet:
Zurück
Oben