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

if-anweisung

Hallo,

ich hänge schon wieder mit dem Programm.
So sieht mein Code aus:

Code:
#! /bin/bash
echo -n "Moechten Sie die Kernelversion ansehen ? (j..Ja | n..Nein): "
read abfrage
if [$abfrage == j || $abfrage == J]
then
      uname -r
else
      echo "Fehler!"
fi

Dabei bekomme ich folgende Fehlermeldungen:
if[j = j] || [j == J]: command not found
syntax error near unexpected token `then´
`then´

Devc++
 
A

Anonymous

Gast
Code:
ls -il `which [`
1329880 -rwxr-xr-x 1 root root 26968 22. Sep 2007  /usr/bin/[
ein bisschen anschauen und dann wirst du begreifen, dass [ ein Befehl ist und nicht nur eine einfache Klammer.
Und nach einem Befehl vor der nächsten Option kommt immer ein LEERZEICHEN

Code:
if [ $abfrage == j -o $abfrage == J ]
sollte besser gehen

robi
 
Oh Mann!! Darauf wäre ich nie gekommen, dass es nur wegen den Abstand bzw. -o sein konnte.
Danke nochmals!!

Schöne Grüße!
Devc++
 

framp

Moderator
Teammitglied
Zufälligerweise kämpfe ich gerade mit einem geschachtelten if und finde diesen Thread.

Ich schaffe es nicht in bash folgende komplexere Logik hinzubekommen

Code:
if ($a == "1" && $b == "1") || ($c == "1" && $d == "1" )

Ich habe mit [[ ]] und [ ] und test in allen Variationen rumprobiert ... no success :?

Hat jemand eine Idee wie so eine in jeder höheren Programmiersprache einfache logische Bedingung in bash zu implementieren geht?
 
Oder jene:
Code:
if ( (( a == 1 )) && (( b == 1 )) ) || ( (( c == 1 )) && (( d == 1 )) )

Edgar
 
A

Anonymous

Gast
Code:
if  ([ $a == "1" -a $b == "1" ] || [ $c == "1" -a $d == "1" ] ) ; then echo "a und b oder c und d sind 1"; fi
hat ein paar Klammern weniger, wobei hier der gesamte Test in einer Subshell läuft und der 2 Testbefehl nur dann ausgeführt wird, wenn der erste nicht zutrifft.

robi
 
Und nicht vergessen: die Feldnamen immer schön in doppelte Hochkommas schreiben. Sonst gibt's einen Fehler, wenn da mal nichts drinsteht. Ist also besonders wichtig, wenn die Eingabe (wie im ersten Fall) von der Tastatur gelesen wird.
 

framp

Moderator
Teammitglied
Vielen Dank für die 3 verschiedenen Lösungsvorschläge :D . Da ich gerne [[ ]] benutze werde ich die sol 2 wohl zukünftig nehmen. Der Trick mit der Subshell bei sol 1 und sol 3 ist auch gut um LaufZeit einzusparen. Dass man das $ bei sol 3 bei den Variablen nicht braucht war mir bislang nicht bekannt.

Code:
a=1; b=2; c=2; d=1

if ([ $a == "1"  -a  $b == "1" ] || [ $c == "1" -a $d == "1" ]); then                         # sol 1
###if ([ $a == "1"  &&  $b == "1" ] || [ $c == "1" && $d == "1" ]); then                -> missing ] Fehler
#if [[ $a == "1"  &&  $b == "1" ]] || [[ $c == "1" && $d == "1" ]] ; then                  # sol 2
#if ( ((a == 1))  &&  ((b == 1)) ) || ( (( c == 1 )) && (( d == 1 )) ) ; then                # sol 3
        echo "true"
else
        echo "false"
fi

Anbei ein paar nette Links zu Bash Scripting für Interessierte:

Advanced bash scripting guide -> http://tutor.hsz-t.ch/tutorials/abs/HTML/
Demystify test, [, [[, ((, and if-then-else -> http://www.ibm.com/developerworks/library/l-bash-test.html
 

framp

Moderator
Teammitglied
notoxp schrieb:
Und nicht vergessen: die Feldnamen immer schön in doppelte Hochkommas schreiben. Sonst gibt's einen Fehler, wenn da mal nichts drinsteht. Ist also besonders wichtig, wenn die Eingabe (wie im ersten Fall) von der Tastatur gelesen wird.
Jupp. Und wenn man zwei Variablen vergleicht
Code:
if [[ "$a" == "$b" ]]; then ...
sollte man, da sowohl a und/oder b leer sein können
Code:
if [[ "X${a}" == "X${b}" ]]; then ...
benutzen :roll:
 
framp schrieb:
Jupp. Und wenn man zwei Variablen vergleicht
Code:
if [[ "$a" == "$b" ]]; then ...
sollte man, da sowohl a und/oder b leer sein können
Code:
if [[ "X${a}" == "X${b}" ]]; then ...
benutzen :roll:
Wozu? :evil: Die Anführungszeichen stellen doch sicher, dass wenn a oder b leer sein sollte, die Expansion immer noch ein Argument bleibt!
Bsp `ls $a`, wenn in $a nix drin steht, wird alles gelistet, hingegen `ls "$a"` berichtet korrekterweise, dass es den leeren Dateinamen "" nicht gibt.
Setz ich das dochmal auf die Liste der häufigsten Shell(denk)fehler...
 
Oder du nimmst die Doppelklammer der Integer-Arithmetik der Bash, dann ist es egal, ob die Variable leer ist oder nicht. Der Vergleich wird korrekt ausgeführt.

Edgar
 

framp

Moderator
Teammitglied
In der Tat. Ich habe mir nicht die Mühe gemacht von http://db.glug-bom.org/Documentation/abs-guide/comparison-ops.html#AEN2272 den Hint
Code:
As S.C. points out, in a compound test, even quoting the string variable might not suffice. [ -n "$string" -o "$a" = "$b" ] may cause an error with some versions of Bash if $string is empty. The safe way is to append an extra character to possibly empty variables, [ "x$string" != x -o "x$a" = "x$b" ] (the "x's" cancel out).
zu testen :oops:
 
"Some versions of bash", das ich nicht lache. Es sollte wohl vielmehr sein "some versions of sh". Aber selbst dann gelte es nur für [, aber nicht für [[. Und letzteres sieht man in #bash lieber.
 
Hallo!

wollte nur bescheid geben, dass sich auf dieser Seite:
http://bin-bash.de/scripts.php

Eine Tabelle befindet, die wie ich finde super genial auch zu dem Themenbereich passt. Die Überschrift zu der Tabelle ist "Bedingungen und Verzweigungen"

Hoffe was passendes beigetragen zu haben.

Gruß

R
 
Oben