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

Anfäger Frage zur shell Programmierung !!! Hilfe gesucht!

Hallo.

Ich mache gerade ein tutorial zum Thema shell Programmierung.
Möchte Linux "lernen und Verstehen" :)

Bei folgenden komme ich nicht weiter:

#!/bin/bash
clear

# prüfen, ob ein Argument übergeben wurde

if [ $# == 0 ] ;
then
echo "Es wurde kein Name angegeben."
echo "Der Name muss beim Scriptaufruf als Argument mit übergeben werden."
else
echo "Mein Name ist $#"
fi
echo ""


Folgende Fehlermeldung kommt:

05_argu: 6: [: 1: unexpected operator

Hab schon alles versucht (if Anweissung zu quoten usw.), nichts hilft.

Was ist das Problem ? Kann mir jemand helfen ?

Gruß
 

framp

Moderator
Teammitglied
Wenn Du Code Tags benutzen wuerdest kann man alles besser lesen :roll:

Ich habe Deine paar Zeilen kopiert und bei mir laeuft es. Ich kann mir nur denken, das Du in der if Zeile keine Leerzeichen zwischen Operanden und Operator sowie [ und ] stehen hast.
 

abgdf

Guru
1. Statt der [ ... ] kann man auch den test-Befehl, der dadurch abgekürzt wird, ausschreiben. Dazu kann man dann auch "man test" lesen.
2. Das Semikolon am Ende der if-Zeile ist optional, wenn man das "then" in die nächste Zeile schreibt (nicht, wenn's in der if-Zeile unmittelbar folgt). Also, hier würd' ich's dann weglassen.
3. Ich würde Code-Blöcke um 4 Zeichen einrücken. Muß man sich zuerst dran gewöhnen, aber mit der Zeit ist es sehr viel übersichtlicher.
4. $# gibt offensichtlich nicht den Namen aus, sondern die Anzahl der Argumente.
Ich würd's also erstmal so schreiben:
Code:
#!/bin/bash

clear
if test $# == 0
then
    echo "Es wurde kein Name angegeben."
    echo "Der Name muss beim Scriptaufruf als Argument mit übergeben werden."
else
    echo "Mein Name ist $#"
fi
echo ""
Wie Du ein Skript in abspeicherst, ausführbar machst ("chmox +x skript.sh") und startest ("./skript.sh"), weißt Du?
 
A

Anonymous

Gast
framp schrieb:
Wenn Du Code Tags benutzen wuerdest kann man alles besser lesen :roll:

Ich habe Deine paar Zeilen kopiert und bei mir laeuft es. Ich kann mir nur denken, das Du in der if Zeile keine Leerzeichen zwischen Operanden und Operator sowie [ und ] stehen hast.

genau das ist das Problem
Code:
if [$# == 0 ] ;
gibt Fehlermeldung: "./script.sh: Zeile 6: [1: Kommando nicht gefunden."

Code:
if [  $# == 0 ] ;
funktioniert.

Erklärung ist folgende:
Code:
 ls -il /usr/bin/[
167531 -rwxr-xr-x 1 root root 34564 24. Okt 2009  /usr/bin/[

diese eckige Klammer ist hier der Befehle (Programm) und zwar die Datei "/usr/bin/[ " ( eine geringfügig anderes compilierte Programmdatei /usr/bin/test , in einigen Systemen sind auch beide gleich und die Dateien haben die selbe Inodenummer. )
Aus diesem Grund muss hier hinter dieser Klammer ein Leerzeichen stehen, sonst wird dieses nicht als Datei gefunden sondern im PATH nach Dateien gesucht die mit "[" beginnen und dann den Anfang der Optionen bis zum ersten Leerzeichen enthalten. In deinem Fall also entweder "[0" oder "[1" ...... usw je nachdem wieviele Optionen du beim Aufruf an das Script anhängst.
Solche Dateien gibt es natürlich nicht. also kommt diese Fehlermeldung.


robi

PS: abgdf war schneller.
 

framp

Moderator
Teammitglied
abgdf schrieb:
... 4. $# gibt offensichtlich nicht den Namen aus, sondern die Anzahl der Argumente.
Good catch. Da müßte $1 stehen :)

@robi: Ich war zu faul die diversen Permutationen mit und ohne Space durchzuprobieren - das ist leider eine Nightmare mit den Spaces in bash :-(

<OT>Letztens hatte ich ein Statement
Code:
v==x
und ich habe mich gewundert warum die Var v immer ein = am Anfang hatte. ... bis ich meine Brille geputzt hatte .. und sah dass da ein == anstatt eines = :eek:0: stand
</OT>
 
Oben