# Bash scripting

## SinoTech

Versuch mich grade etwas mit scripts unter Linux. Nun habe ich ein kleines Problem und weiß ehrlichgesagt nicht warum das script nicht funktioniert.

```

# @(#) count2 Zeilen einer Datei zaehlen

#

# Aufruf: count datei

DATEI=$1

anzahl=0

cat $DATEI |

while read ZEILE

do

   (( anzahl=anzahl+1 ))

   echo "Anzahl = $anzahl"

done

echo "$DATEI: $anzahl Zeilen"

```

Wie man nur unschwer erkennen kann soll das Script die Zeilen einer Datei zählen. Problem ist nun das es als Ergebniss immer 0 ausgibt. Also die Ausgaben in der Schleife sind korrekt (Gibt aktuelle Zeile aus). Nur nach der Schleife wird die Variable anscheinend wieder zurück auf ihren Anfangswert gesetzt. Wie kann ich das verhindern ?

Mfg

Sino

----------

## STiGMaTa_ch

 *SinoTech wrote:*   

> Versuch mich grade etwas mit scripts unter Linux. Nun habe ich ein kleines Problem und weiß ehrlichgesagt nicht warum das script nicht funktioniert.
> 
> ```
> 
> # @(#) count2 Zeilen einer Datei zaehlen
> ...

 

Hallo SinoTech

Wozu das Rad zweimal erfinden?

```
cat DATEI | wc -l
```

Ausserdem kannst du mit wc auch die Wörter oder Zeichen zählen!

Und falls es auch irgend einem Grund doch mit der Bash sein soll, verwendest du "let" oder noch besser "expr".

```
man let

man expr
```

sollten dir weiterhelfen.

Lieber Gruss

STiGGi

----------

## lorschy

naja wie mein vorredner schon sagte, warum was neu erfinden was esschon gibt.....

bzw anzahl=$(($anzahl+$i)) oder halt mit let hjier is noch nen guter link http://www.tldp.org/LDP/abs/html/

----------

## SinoTech

Tja, habe demnächst eine Klausur in der es unter anderem um Shell-Scripte geht. Von daher probiere ich gerade ein paar kleine Sachen selbst zu tippseln.

Mfg

Sino

P.S.: Danke für den link, werd gleich mal reinschauen.  :Smile: 

----------

## c07

 *STiGMaTa_ch wrote:*   

> 
> 
> ```
> cat DATEI | wc -l
> ```
> ...

 

Das heißt 

```
wc -l $DATEI
```

 oder 

```
<$DATEI wc -l
```

 wenn dus nicht auf den Useless-Use-of-cat-Award abgesehn hast.

Und im Threadtitel fehlt ein [OT] krass.

----------

## gentop

Hi,

http://www.fh-wedel.de/~si/vorlesungen/internet/Unix/ShellProg.html könnte dir vielleicht behilflich sein.

//gentop

----------

## SinoTech

@c07

Hmm .. hat doch was mit Linux zu tun .. also wieso [OT] ?

@gentop

Thx für den Link  :Smile: 

Mfg

Sino

----------

## Deever

 *c07 wrote:*   

> 
> 
> ```
> <$DATEI wc -l
> ```
> ...

 Ich hätte nicht gedacht, daß die Bash das sorum macht. Ein

```
< $DATEI | wc -l
```

frißt die allerdings nicht, im Gegensatz zur zsh!

 * wrote:*   

> @c07 
> 
> Hmm .. hat doch was mit Linux zu tun

 Was denn genau? (Ausser gar nichts, mein' ich?)

 *Quote:*   

>  .. also wieso [OT] ?

 Du plenkst, warum?

Gruß,

/dev

----------

## gentop

PS: Wenn du nur den Link http://www.fh-wedel.de/~si/ eingibst, landest du direkt auf der Homepage meines Profs. Dort hat er noch weitere interessante Themen in Bezug auf Unix und Programmiersprachen.

//gentop

----------

## SinoTech

 *Deever wrote:*   

> 
> 
>  * wrote:*   @c07 
> 
> Hmm .. hat doch was mit Linux zu tun
> ...

 

Naja, hier im Forum geht es doch um Linux. Und meine Frage hat doch was mit Linux zu tun !? Also wieso soll ich diesen Thread als OT markieren ? Oder willst du jetzt etwa jeden Thread der sich nicht um den Kernel dreht als OT makieren lassen  :Wink:  ?

 *gentop wrote:*   

> 
> 
> PS: Wenn du nur den Link http://www.fh-wedel.de/~si/ eingibst, landest du direkt auf der Homepage meines Profs. Dort hat er noch weitere interessante Themen in Bezug auf Unix und Programmiersprachen.
> 
> 

 

Hehe ... die Site kommt mir doch sehr bekannt vor. War letztens schonmal drauf als ich Unterlagen zu Compilerbau gesucht habe  :Smile: . Tja, die Welt ist ja so klein  :Smile: 

Mfg

Sino

----------

## psyqil

 *SinoTech wrote:*   

> Naja, hier im Forum geht es doch um Linux. Und meine Frage hat doch was mit Linux zu tun 
> 
> !?

 Hier im Forum geht es um Gentoo, und Deine Frage hat was mit einer Shell zu tun, die auf etlichen Systemen läuft.  :Razz: 

----------

## c07

 *SinoTech wrote:*   

> Naja, hier im Forum geht es doch um Linux.

 

Ich hab immer gedacht, es würd hier um Gentoo gehn. Und da ist nicht mal unbedingt Linux dabei.

 *SinoTech wrote:*   

> Und meine Frage hat doch was mit Linux zu tun !?

 

Wird auf anderen Unixsystemen auch nicht anders sein. Die Bash ist halt eine Anwendung, und rein anwendungsbezogene Fragen sind für mich OT. Im Prinzip ist sie nichts Anderes wie eine Frage zur HTML-Programmierung o.Ä. (ok, nicht ganz: zur Wartung eines Gentoosystems ist Shellskripting nützlicher als HTML).

----------

## toralf

 *Deever wrote:*   

>  *c07 wrote:*   
> 
> ```
> <$DATEI wc -l
> ```
> ...

 

Warum nicht, schließlich ist

```
<$DATEI wc -l
```

äuivalent zu

```
wc -l <$DATEI
```

weil ja auch z.B.

```
ls -a -l
```

das gleiche ist wie

```
ls -l -a
```

Davon abgesehen kann ich dein Problem nicht reproduzieren:

```

tfoerste@nhh221 ~/bin $ cat c.sh

#!/bin/sh

a=0

b=0

echo " - a=$a b=$b -"

while [[ $a < 5 ]]; do

        echo -en "a=$a  b=$b\t\t"

        ((a=a+1))

        ((b=b+1))

        echo  "a=$a  b=$b"

done

echo " + a=$a b=$b +"

tfoerste@nhh221 ~/bin $ chmod 755 c.sh

tfoerste@nhh221 ~/bin $ ./c.sh

 - a=0 b=0 -

a=0  b=0                a=1  b=1

a=1  b=1                a=2  b=2

a=2  b=2                a=3  b=3

a=3  b=3                a=4  b=4

a=4  b=4                a=5  b=5

 + a=5 b=5 +

```

----------

## primat

 *SinoTech wrote:*   

> 
> 
> Naja, hier im Forum geht es doch um Linux. Und meine Frage hat doch was mit Linux zu tun !? Also wieso soll ich diesen Thread als OT markieren ? Oder willst du jetzt etwa jeden Thread der sich nicht um den Kernel dreht als OT makieren lassen  ?
> 
> 

 

Na, Linux ist halt wirlich nur der Kernel! Siehe:

http://www.fsf.org/gnu/linux-and-gnu.html

Also hat die Frage genau genommen weder mit Linux noch mit Gentoo direkt was zu tun! -> [OT]

Gruss

----------

## SinoTech

Also für mich gehört hier alles rein was speziell mit Gentoo oder Linux im allgemeinen zu tun hat. Heißt für mich so etwas wie Windowmanager installieren und konfigurieren, Anwendungen installieren etc. und natürlich auch die SHELL da diese eine der grundlegensten Dinge von Linux / Unix ist.

Eurer Definition nach zu urteilen müsste hier jeder zweite Thread als OT markiert werden :

- Frage zu Xorg -> Anwendungsbezogen -> OT

- Frage zu Iptables -> Anwendungsbezogen da iptables eine Anwendung ist -> OT

- Frage zu Mozilla / Thunderbird, ... -> Anwendungsbezogen -> OT

- ...

Ist dieses Forum dann überhaupt noch sinnvoll ?

Mfg

Sino

----------

## gentop

Ist doch jetzt sowas von egal ob dies OT ist oder nicht... man kanns auch übertreiben!

//gentop

----------

## SinoTech

 *toralf wrote:*   

> 
> 
> Davon abgesehen kann ich dein Problem nicht reproduzieren:
> 
> ```
> ...

 

Jep, der code funktioniert (Habe es mal ausprobiert). Aber wenn ich versuche die Zeilen einer Datei zu zählen lässt mich die BASH im Stich.

```

#!/bin/bash

DATEI=$1

anzahl=0

# #####################

# 1. TEIL

# Dieser Code funktioniert NICHT (Letzte Zeile gibt immer Anfangswert von "anzahl" aus.

# #####################

cat $DATEI |

while read ZEILE && [[ $anzahl -lt 5 ]]

do

   ((anzahl++))

   echo "AAAAAAAAAAA : $anzahl"

done

echo "Anzahl : $anzahl"

# #####################

# Dieser Code funktioniert (Letzte Zeile gibt den korrekten Wert von "anzahl" aus)

# #####################

while [[ true ]]

do

   ((anzahl++))

   if [[ anzahl -eq 10 ]]

   then

      echo "Break"

      break

   fi

done

echo "Anzahl : $anzahl"

```

Sieht so aus als ob im ersten Teuil meines Codes die Schleife in einer Sub-Shell ausgeführt wird !? Und deswegen der ausgegebene Wert wieder dem Anfangswert entspricht.

----------

## c07

 *SinoTech wrote:*   

> Eurer Definition nach zu urteilen müsste hier jeder zweite Thread als OT markiert werden

 

Naja, ziemlich viele schon, aber alles, was mit Installation und grundlegender Konfiguration zusammenhängt (um das System halt zum Laufen zu kriegen bzw. am Laufen zu halten) ist für mich schon noch im normalen Rahmen. Oft ist da auch erstmal unklar, ob das Problem Gentoo-spezifisch ist oder nicht.

 *SinoTech wrote:*   

> Sieht so aus als ob im ersten Teuil meines Codes die Schleife in einer Sub-Shell ausgeführt wird !?

 

Ja, die Pipe erzwingt das natürlich.

----------

## toralf

 *Quote:*   

> 
> 
> Sieht so aus als ob im ersten Teuil meines Codes die Schleife in einer Sub-Shell ausgeführt wird
> 
> 

 

Korekt, 'man read' sagt dies auch, hab' nicht mehr daran gedacht.

----------

## SinoTech

Stimmt. Wenn ich alles hinter der Pipe in Klammern setze funktioniert es:

```

cat $DATEI | (

while read ZEILE && [[ $anzahl -lt 5 ]]

do

   ((anzahl++))

   echo "AAAAAAAAAAA : $anzahl"

done

echo "Anzahl : $anzahl" 

)

```

Blöde syntax  :Sad: . Naja, sonst wärs ja auch zu einfach  :Wink: 

Mfg

Sino

----------

## tam

 *gentop wrote:*   

> http://www.fh-wedel.de/

 

Ey, da war ich auch, ist aber schon lange her (:

----------

## gentop

Cool  :Wink: 

//gentop

----------

## Fabiolla

Hallo, 

hätt da auch noch einen Link für Shellscripte.

lg

----------

## SinoTech

Ok, thanx nochmal an alle  :Smile: 

Mfg

Sino

----------

