# Hilfe shellscript [solved]

## tazinblack

Hallo zusammen,

nachdem ich diesem "Phänomen" jetzt schon öfters begegnet bin, frag ich mal Euch im Rat.

Wie kann ich in nem Bash-Skript ne Variable definieren und diese innerhalb von ner while-Schleife ändern?

Beispiel:

```
#!/bin/bash

  TEXT=leer

  /usr/bin/df -h | \

  while read LINE

  do

    if [ "${TEXT}" = "leer" ]; then

      TEXT="nicht mehr ${TEXT}"

    fi

    echo "Text : ${TEXT}"

  done

  echo "Text : ${TEXT}"
```

Das df tut eigentlich nichts zur Sache, ist nur mal eben, um ne Kurze while-Schleife zu haben.

Ich würde gerne innerhalb der while-Schleife den Text entsprechend diversen if-Bedingungen oder ähnlichem anpassen.

Ich hab schon ne Menge versucht im Laufe der Zeit, aber ne gute Lösung hab ich noch nicht gefunden.

Im Prinzip bräuchte ich sowas wie ne globale Variable.

----------

## firefly

das liegt daran, dass die shell unter Umständen für die while loop eine subshell erzeugt und somit die TEXT variable am Anfang nicht identisch mit der TEXT variable innerhalb der while schleife ist.

siehe auch: http://fvue.nl/wiki/Bash:_Piped_%60while-read%27_loop_starts_subshell

----------

## Finswimmer

```

[14:43:50]|[tobi@tobi-desktop]|~

$test=1

[14:44:04]|[tobi@tobi-desktop]|~

$i=1

[14:44:05]|[tobi@tobi-desktop]|~

$while [ $i -le 10 ] ;do  i=$[$i+1] ; test="test2 $(echo $test) $i";echo $test;done

test2 1 2

test2 test2 1 2 3

test2 test2 test2 1 2 3 4

test2 test2 test2 test2 1 2 3 4 5

test2 test2 test2 test2 test2 1 2 3 4 5 6

test2 test2 test2 test2 test2 test2 1 2 3 4 5 6 7

test2 test2 test2 test2 test2 test2 test2 1 2 3 4 5 6 7 8

test2 test2 test2 test2 test2 test2 test2 test2 1 2 3 4 5 6 7 8 9

test2 test2 test2 test2 test2 test2 test2 test2 test2 1 2 3 4 5 6 7 8 9 10

test2 test2 test2 test2 test2 test2 test2 test2 test2 test2 1 2 3 4 5 6 7 8 9 10 11

```

Klappt doch ganz gut?

Oder habe ich dich falsch verstanden?

Tobi

----------

## 69719

firefly hat recht, durch die Subshell, ausgelöst durch die Pipe kannst du nicht an das script zurückgeben. Eine Variante wäre den entsprechenenden Wert in eine Datei zu scheiben und auszulesen.

----------

## firefly

 *Finswimmer wrote:*   

> 
> 
> ```
> 
> [14:43:50]|[tobi@tobi-desktop]|~
> ...

 

dann probier mal sein beispiel aus  :Wink: 

----------

## py-ro

Du musst die Pipe vor dem while loswerden.

Versuch da mal das

```
DF=$(df -h)

while read LINE <<<$DF

```

den die Pipe erzeugt tatsächlihc nee Subshell.

Py

----------

## tazinblack

 *tazinblack wrote:*   

> Hallo zusammen,
> 
> nachdem ich diesem "Phänomen" jetzt schon öfters begegnet bin, frag ich mal Euch im Rat.
> 
> Wie kann ich in nem Bash-Skript ne Variable definieren und diese innerhalb von ner while-Schleife ändern?
> ...

 

Sorry, ich hab ja die Ausgabe des Testskripts ganz vergessen :

```
Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : nicht mehr leer

Text : leer

```

Aber ich seh schon, ihr habt die richtigen Stichwörter schon genannt.

Ich bastel da nach nochmal dran rum.

Ich wusste ja dass ihr für so Knobelaufgaben zu haben seid  :Smile: 

----------

## tazinblack

 *py-ro wrote:*   

> Du musst die Pipe vor dem while loswerden.
> 
> Versuch da mal das
> 
> ```
> ...

 

Das gefiel mir am besten, da es schön kompakt ist. Leider geht mit da, wie es aussieht, irgendwie der Zeilenumbruch verloren und ich hab, warum auch immer, ne Endlosschleife.  :Sad: 

Ich hab jetzt dem Link entsprechend sowas hier gemacht:

```
#!/bin/bash

while read line; do

    foo=bar

    echo foo1: $foo

done < <(/bin/bin/df -h)

echo foo2: $foo

# Example output:

# foo1: bar

# foo2: bar

```

Das läuft jetzt. Leider ist es damit nicht mehr posix compliant. aber es funktioniert sehr schick, solang man vorher nicht das hier macht: 

```
set -o posix
```

----------

## mv

 *tazinblack wrote:*   

> Leider ist es damit nicht mehr posix compliant.

 

Wenn es nicht um eine ewig lange Ausgabe geht, kannst Du sie mit POSIX in den Speicher "slurpen":

```
#! /bin/sh

while read a

do   echo "Zeile: $a"

done <<EOF

`df`

EOF
```

Edit: Eine andere Art zu slurpen ist 

```
#! /bin/sh

IFS='

'

for a in `df`

do   echo "Zeile: $a"

done
```

----------

## 69719

 *mv wrote:*   

>  *tazinblack wrote:*   Leider ist es damit nicht mehr posix compliant. 
> 
> Wenn es nicht um eine ewig lange Ausgabe geht, kannst Du sie mit POSIX in den Speicher "slurpen":
> 
> ```
> ...

 

Danke für den IFS Tip!

----------

