If-else fejl, Bash shell-scripting

Tags:    bash shellscript shell linux ubuntu

Får følgende output:
Fold kodeboks ind/udKode 


Når jeg kører følgende kode:
Fold kodeboks ind/udKode 




10 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Der findes ikke et "else if" udtryk i bash - Det du egentlig skriver er:

Fold kodeboks ind/udKode 


Du kan løse det på to måder, med "elif":

Fold kodeboks ind/udKode 


eller med to "fi":
Fold kodeboks ind/udKode 


PS: Du mener formentligt "[ $b < $a ]" i stedet for "[ $b > $a ]"

Det hele kan yderligere simplificeres til:
Fold kodeboks ind/udKode 


Lige nu, opretter dit script en fil med navnet af det sidste nummer - den fejl har mit sidste script ikke.



Indlæg senest redigeret d. 03.03.2013 12:09 af Bruger #11328
Det gør man for at afslutte if-udtrykket. Man kan enten vælge at skifte linje, eller skrive "if [ ... ]; then" - Jeg foretrækker det sidste :)



I bash findes der forskellige typer "equality" operatorer. > og < bliver brugt til strings. Du skal derfor benytte:

-lt som betyder "less than"
-gt som betyder "greater than" og
-eq som betyder "equal"

Disse operatorer er beregnet til talværdier. Her er en liste over hvordan de forskellige operatorer og hvordan de bruges: http://tldp.org/LDP/abs/html/comparison-ops.html

PS: Et af dine tjek kan udelades, da et tal nødvendigvis må være enten lig, større eller mindre end - Derfor kan din sidste "elif" omskrives til en simpel "else" uden noget booleansk udtryk.



Det undrede jeg mig også først over, men nu tror jeg det er gået op for mig: Det skyldes at Bash tolker din ">" operator som en "redirect" operator. Altså den operator du også bruger når du skriver til en fil:

echo Hej > file.txt

Resulterer i en fil kaldet "file.txt" med indholdet "Hej"

1 > 2

Resulterer i en fil kaldet "2" uden indhold, da kommandoen "1" formentlig ikke er en gyldig kommando i din konsol og derfor ikke har skrevet noget til stdout.



Indlæg senest redigeret d. 03.03.2013 18:38 af Bruger #11328
Okay mange tak! Hvordan kan det være der kun skal sættes semikolon ved den sidste if sætning?



Det gør man for at afslutte if-udtrykket. Man kan enten vælge at skifte linje, eller skrive "if [ ... ]; then" - Jeg foretrækker det sidste :)


Okay! Lige noget andet underligt - når jeg kører scriptet og det er færdigt, så laver den en tom tekst fil, hvor navnet på filen er variablen b's værdi... Hvorfor gør den det?







Indlæg senest redigeret d. 03.03.2013 14:53 af Bruger #2695


Ved ikke hvad der er sket, men jeg kan ikke se dit svar o.o

Her er mit script som i øvrigt ikke virker, den printer ud "The first number is biggest!", lige gyldigt hvad jeg skriver... Og den laver stadig filer med b's værdi som titel. Mystisk..

Script
Fold kodeboks ind/udKode 


STDOUT (Det er da det man kalder det ikke? :S)
Fold kodeboks ind/udKode 




I bash findes der forskellige typer "equality" operatorer. > og < bliver brugt til strings. Du skal derfor benytte:

-lt som betyder "less than"
-gt som betyder "greater than" og
-eq som betyder "equal"

Disse operatorer er beregnet til talværdier. Her er en liste over hvordan de forskellige operatorer og hvordan de bruges: http://tldp.org/LDP/abs/html/comparison-ops.html

PS: Et af dine tjek kan udelades, da et tal nødvendigvis må være enten lig, større eller mindre end - Derfor kan din sidste "elif" omskrives til en simpel "else" uden noget booleansk udtryk.


Mange tak! Nu forstår jeg bedre hvorfor det ikke virkede og nu får jeg heller ingen nye uønskede filer :) Hvorfor kom der egentlig filer? o.o



Det undrede jeg mig også først over, men nu tror jeg det er gået op for mig: Det skyldes at Bash tolker din ">" operator som en "redirect" operator. Altså den operator du også bruger når du skriver til en fil:

echo Hej > file.txt

Resulterer i en fil kaldet "file.txt" med indholdet "Hej"

1 > 2

Resulterer i en fil kaldet "2" uden indhold, da kommandoen "1" formentlig ikke er en gyldig kommando i din konsol og derfor ikke har skrevet noget til stdout.


Når ja, det er klart. Mange tak :P



t