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

Wo ist das manual zu "IF"

Rumak18

Member
Hallo,
es gibt ja so viele Möglichkeiten eine IF Klausel zu erstellen beispielsweise mit Vergleichsoperatoren wie "-ne" oder "-eq" usw.... aber wo sind diese denn eigentlich dokumentiert?
Wenn ich "man if" eingebe, dann steht dort nichts davon.
 

panamajo

Guru
Paket bash-doc installieren, dann gibt es
Code:
man bash
man bashbuiltins
sowie
Code:
/usr/share/doc/packages/bash/bashref.html
 
OP
R

Rumak18

Member
Danke!
"man test" ist genau das , was ich suche. Ich liebe zwar LInux, aber genau das sind solche kleinen Feinheiten, die den Laien von Linux abschrecken.
 

boser

Member
[klugscheissermodus=on]
das sind genau die Kleinigkeiten , die Linux erst zu Linux machen und dann ist das keine Schwierigkeit , sondern ein Eigenschaft, die es liebenswürdig macht.
Nur die Lernwildligen und Aufgeschlossenen kommen durch. :D
[/klugscheissermodus=off]
 

uhelp

Member
Da wäre mal prinzipiell zu beachten, dass das meist sogenannte BashBuiltins sind.
Es gibt viele Befehle, die zwar meist in /bin liegen, aber dennoch selten bis nie ausgeführt werden,
da sie in der bash selbst intern viel effizienter implementiert sind.

Generell gilt: Hilfe für interne Kommandos mit "help"
Hilfe zu externen Kommandos mit "man" oder "info".


Will man sicher sein, dass z.B. ein "echo" wirklich aus /bin aufgerufen wird,
hält die bash das
Code:
user@host:~> help command
command: command [-pVv] Kommando [Argument ...]
    Execute a simple command or display information about commands.               
                                                                                  
    Runs COMMAND with ARGS suppressing  shell function lookup, or display         
    information about the specified COMMANDs.  Can be used to invoke commands
    on disk when a function with the same name exists.
    
    Options:
      -p        use a default value for PATH that is guaranteed to find all of
        the standard utilities
      -v        print a description of COMMAND similar to the `type' builtin
      -V        print a more verbose description of each COMMAND
    
    Exit Status:
    Returns exit status of COMMAND, or failure if COMMAND is not found.
bereit.
Um sicherzustellen, dass man also NICHT ein internes Comamndo der bash aufruft, stellt man ein "command" voran:
Code:
 command echo "BlubberPlapper"

Das gilt für alle Befehle, die sowohl intern, wie auch extern existieren.
Man suche einmal nach "test" , "[" oder "[[".
Je nach Linux- Distri, oder BSD*, oder gar Unices sind das mal externe, mal interne, oder oft sogar interne und externe Befehle.
Und jedes Stückchen ist ein klein wenig anders.
Auf dem einen System ist "[" nur ein Link zu "test", auf dem anderen ist es ein eigenes Binary.

Meist spielt das keine Rolle. Wird es aber kravotisch, kann genau da das Problem liegen.
Zum einen sind viele Befehle von Unix zu Unix von Linux zu Linux leicht anders implementiert, zum anderen kann sich jede Shell -also auch die BASH- je nach Aufruf (und/oder nach (fest) vorgebenem) Environment anders verhalten. POSIX wäre hier nur das bekannsteste Stichwort.

Generell gilt, dass man Hilfe zu internen Befehlen mit "help command" erhält.
Ein paar Beispiele:
Code:
# Hilfe für "if"
user@host:~> help if
if: if Kommandos; then Kommandos; [ elif Kommandos; then Kommandos; ]... [ else Kommandos; ] fi
    Execute commands based on conditional.
    
    The `if COMMANDS' list is executed.  If its exit status is zero, then the
    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is
    executed in turn, and if its exit status is zero, the corresponding
    `then COMMANDS' list is executed and the if command completes.  Otherwise,
    the `else COMMANDS' list is executed, if present.  The exit status of the
    entire construct is the exit status of the last command executed, or zero
    if no condition tested true.
    
    Exit Status:
    Returns the status of the last command executed.

# Hilfe zu Befehlen, wie "[["
# Man beachte, dass diese Befehle gequotet werden müssen, damit sie nicht von 
# der rufenden [b]bash[/b] fälschlicherweise geschluckt werden. Das gilt natürlich auch 
# für "(" "[" "&&" etc....
user@host:~> help "[["
[[ ... ]]: [[ Ausdruck ]]
    Execute conditional command.
    
    Returns a status of 0 or 1 depending on the evaluation of the conditional
    expression EXPRESSION.  Expressions are composed of the same primaries used
    by the `test' builtin, and may be combined using the following operators:
    
      ( EXPRESSION )    Returns the value of EXPRESSION
      ! EXPRESSION              True if EXPRESSION is false; else false
      EXPR1 && EXPR2    True if both EXPR1 and EXPR2 are true; else false
      EXPR1 || EXPR2    True if either EXPR1 or EXPR2 is true; else false
    
    When the `==' and `!=' operators are used, the string to the right of
    the operator is used as a pattern and pattern matching is performed.
    When the `=~' operator is used, the string to the right of the operator
    is matched as a regular expression.
    
    The && and || operators do not evaluate EXPR2 if EXPR1 is sufficient to
    determine the expression's value.
    
    Exit Status:
    0 or 1 depending on value of EXPRESSION.
Hier zeigt sich, was leider sehr, sehr Viele mistverstehen:
Der Befehl "if" besteht letztlich aus vier Kommandos, wovon das elif beliebig oft wiederholt werden darf.
Und JEDES dieser Teilkommandos kann BELIEBIG VIELE Befehle ausführen. Genau, was die erste Zeile von "help if" sagt:
if Kommandos; then Kommandos; [ elif Kommandos; then Kommandos; ]... [ else Kommandos; ] fi

Code:
# Der Befehl zeigt, dass selbst der Bedingungsteil von "if" aus mehreren Kommandos bestehen kann:
if ls ; echo "hubert"; ((2<3)) ; then echo "zwei ist kleiner als drei"; else echo"zwei ist gößer als drei" ;fi
# (über mir ist nur eine Zeile Kommentar. und eine einzige lange Zeile Code.)

#Was das IF dann letztlich für wahr oder falsch hält, entscheidet einzig und alleine der RETURNCODE des letzten Kommandos
 
# Entscheided ist also der artihmetische Ausdruck ((2<3))
# Da dieser immer 0 (zero) zurückgibt, was "wahr" bedeutet, wird der "then" Zweig ausgeführt.
user@host:~> help "(("
(( ... )): (( Ausdruck ))
    Evaluate arithmetic expression.
    
    The EXPRESSION is evaluated according to the rules for arithmetic
    evaluation.  Equivalent to "let EXPRESSION".
    
    Exit Status:
    Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
JEDER Befehl gibt einen Integerwert (genauer: eine Zahl von 0 bis 255 ) zurück.
Das hat NICHTS mit der Ausgabe des Befehls zu tun.
Das ist schlicht, wie JEDES Betriebssytem arbeitet: Es führt einen Befehl aus und gibt einen Code, der Fehler oder Erfolg meldet zurück. In unserem Falle eben die Zahl 0 für Erfolg, oder eine Zahl von 1 - 255 für irgendeinen Fehler.

Womit wir zu dem Schluss gelangen, dass es viele verschiedene Arten gibt, mal eine schnelle Verzweigung zu schreiben.
Die folgenden Befehle tun alle exakt das Gleiche:
Code:
# einfacher arithmetischer Vergleich 
((1==1))&&echo "Jawohl."||echo "nö!"
# In vorheriger Zeile ist alles schön eng unleserlich geschrieben, was möglich ist, solange das syntakisch möglich ist.

[ 1 -eq 1 ] && echo "Jawohl." || echo "nö."
# Jetzt wäre ein [1-eq1] nicht gegangen, weil die BASH nur ein Token "1-eq1" erkannt hätte.

# beide Varianten funktionieren auch mit "[["
[[1 -eq 1 ]] && echo "Jawohl." || echo "nö."
[[1 == 1 ]] && echo "Jawohl." || echo "nö."

# und schlußendlich mit "if"
if ((1==1)); then echo "jou."; else echo "Nö."; fi
if [ 1 = 1 ]; then echo "jou."; else echo "Nö."; fi
if [[ 1 == 1 ]]; then echo "jou."; else echo "Nö."; fi

#jede der drei vorangehenden "If" Konstruktionen lässt sich auch ohne Semikola schreiben:
if [[ 1 == 1 ]]
then echo "jou."
else echo "Nö."
fi

# oder in gemischter Form
if [[ 1 == 1 ]] ; then 
    echo "jou."
else      echo "Nö." 
fi
Nicht verwirren lassen.
Die Sytax ist immer: if Kommandos; then Kommandos; [ elif Kommandos; then Kommandos; ]... [ else Kommandos; ] fi
Aber syntaktisch sind sowohl ";" , wie auch "\n" (die neue Zeile) schlicht Kommandotrenner.
Sie sind also austauschbar.

Caveat: Auch wenn ich in den Beispielen die logischen Operatoren "=" und "==" synonym verwendet habe, sie sind es NICHT!! Einmal vergleichen sie Strings, einmal Zahlen. Zwar unterscheidet keine Shell das, aber werden sie im Kontext falsch verwendet, hagelt es Fehler. Oder noch schlimmer: Es schleichen sich sehr subtile Fehler ein, die erst später zu Ungemach führen.

LEST die MAN - Pages und die INFO- Pages.!!

Für das mühselige Geschäft des Man- und InfoPages Lesen habe ich aber noch einen wirklich hilfreichen Tip:
Öffnet eueren "Konqueror", der sich meist im Menu unter Internet/Webbrowser findet und gebt dort in die Adresszeile
"man:Kommando", oder "info:Kommando" ein.

Und siehe da: Auf einmal lassen sich diese Monster wundervoll leicht lesen.
Insbesonders bei so riesigen Seiten wie bei der bash ist das eine enorme Erleichterung.
Da Infopages selbst ja intern "Links" haben, kann man mit "info:bash" endlich leicht alles finden, was einen gerade interessiert.
 

zerum

Member
uhelp schrieb:
Öffnet eueren "Konqueror", der sich meist im Menu unter Internet/Webbrowser findet und gebt dort in die Adresszeile
"man:Kommando", oder "info:Kommando" ein.
Nur so nebenbei: Statt "man:Kommando" kann man auch "#Kommando" eingeben.
 
Oben