# Bash: Variableninhalte nicht interpretieren

## buggybunny

Moin moin,

um meine Frage zu verdeutlichen, hier mal ein kurzes script:

```

#!/bin/bash

FOO=`cat myfile.txt`

echo $FOO

```

Besteht nun die Datei myfile.txt z.B. nur aus einem "*" wird statt dem erwarteten "*" stattdessen der Verzeichnisinhalt ausgegeben, da ein

```
echo *
```

von der Bash zu jedem Verzeichnis / Dateinamen innerhalb des working directories expandiert wird.

Nun kann ich ja so etwas verhindern in dem ich ich z.B. sowas mache im script:

```
echo "$FOO"
```

Das find ich aber sehr unschön.

Gibt es einen eleganteren Weg die Bash dazu zu zwingen, den Inhalt einer Variablen nicht zu interpretieren sondern ihn wirklich als string aufzufassen?

----------

## moe

 *buggybunny wrote:*   

> 
> 
> ```
> echo "$FOO"
> ```
> ...

 

Was ist daran unschön?! Nicht vergessen, bash ist eine Skriptsprache somit bedeutet echo foo nicht, gibt die Variable foo aus, sondern gib alles aus was nach echo kommt, hier im Bsp. halt foo.

Und wenn du mit echo $FOO eine Variable ausgibst die * enthält, wird echo * ausgeführt, genau so wie es sein soll, wenn man das nicht will ist echo "$FOO" die einzige schöne Variante die mir einfällt.

Gruss Maurice

edit: Hab das ganze mal etwas getestet, es ist nicht unbedingt echo schuld sondern direkt die Bash. Also ausgehend von deinem Beispiel hast du eine Variable FOO die * enthält. Bei einem echo $FOO wird echo nicht $FOO übergeben und echo macht daraus den Verzeichnisinhalt, sondern die Bash übergibt echo den Verzeichnisinhalt und echo gibt das dann folgerichtig aus. Darum klappt auch das nicht so wie du es willst:

```
function writeln() { echo "$@"; }

FOO=\*

writeln $FOO
```

----------

## toralf

 *buggybunny wrote:*   

> Gibt es einen eleganteren Weg die Bash dazu zu zwingen, den Inhalt einer Variablen nicht zu interpretieren sondern ihn wirklich als string aufzufassen?

 Ohne spitzfindig zu wirken, aber nicht bash, sondern echo mußt Du dazu bringen, oder ?

----------

## sirro

 *toralf wrote:*   

> Ohne spitzfindig zu wirken, aber nicht bash, sondern echo mußt Du dazu bringen, oder ?

 

Lies mal den edit von moe.  :Wink: 

Die bash ist IMHO auch dafür zuständig, schließlich will man ja nicht in jedem mini-programm ein eigenes globbing implementieren.

So sagt man es dann seiner Bash:

http://tldp.org/LDP/abs/html/globbingref.html

```
# set -f

# FOO=\* BAR=*

# echo $FOO $BAR

* *

# set +f

# echo $FOO $BAR

a b c a b c
```

----------

## toralf

 *sirro wrote:*   

> Lies mal den edit von moe. 
> 
> Die bash ist IMHO auch dafür zuständig, schließlich will man ja nicht in jedem mini-programm ein eigenes globbing implementieren.

 *head smack* - natürlich, ich sollte mal wieder erst denken, dann schreiben

----------

## buggybunny

* Ähem *

also danke für die Hilfe, aber Leute, bitte lest doch meine Postings ein bisschen genauer.

Das was ihr mir hier 

 *Quote:*   

> Was ist daran unschön?! Nicht vergessen, bash ist eine Skriptsprache somit bedeutet echo foo nicht, gibt die Variable foo aus, sondern gib alles aus was nach echo kommt, hier im Bsp. halt foo.
> 
> Und wenn du mit echo $FOO eine Variable ausgibst die * enthält, wird echo * ausgeführt

 

hier

 *Quote:*   

> Ohne spitzfindig zu wirken, aber nicht bash, sondern echo mußt Du dazu bringen, oder ?

 

und hier

 *Quote:*   

> Die bash ist IMHO auch dafür zuständig, schließlich will man ja nicht in jedem mini-programm ein eigenes globbing implementieren. 

 

als "mangelndes Verständnis" ankreidet, hatte ich im Eröffnungposting geschrieben:

 *Quote:*   

> Besteht nun die Datei myfile.txt z.B. nur aus einem "*" wird statt dem erwarteten "*" stattdessen der Verzeichnisinhalt ausgegeben, da ein
> 
> Code:
> 
> echo *
> ...

 

Ja, mir ist klar, das die Bash und nicht echo daran "schuld" ist, das hatte ich schließlich schon ganz am Anfang geschrieben.

 *Quote:*   

> So sagt man es dann seiner Bash:
> 
> http://tldp.org/LDP/abs/html/globbingref.html
> 
> Code:
> ...

 

Danke, werd ich mir anschauen........

----------

## Necoro

Was anderes ... verwende bitte wenn möglich $(...) anstatt `...` ... Lesbarkeit wird dadurch erhöht  :Smile: 

----------

## 69719

```

#!/bin/bash

FOO=`cat myfile.txt`

echo $FOO

```

ändern zu

```

#!/bin/bash

FOO=`cat myfile.txt`

echo "$FOO"

```

der schönheit halber

```

#!/bin/bash

FOO=$(cat myfile.txt)

echo "$FOO"

```

unschön ist was anderes

----------

## sirro

 *buggybunny wrote:*   

>  *Quote:*   Die bash ist IMHO auch dafür zuständig, schließlich will man ja nicht in jedem mini-programm ein eigenes globbing implementieren.  
> 
> als "mangelndes Verständnis" ankreidet

 

Ähm, der Kommentar bezog sich nicht auf dich sondern auf toralf, der ja vermutet hatte, dass es die Sache von echo ist. Ich hab (nochmal) klargestellt, dass es die bash ist und habe ihm in dem Zusammenhang gesagt, warum ich die Bash für zuständig halte. Auf moe habe ich nur verwiesen weil er mit einem Beispiel gut gezeigt hat, dass es halt die Bash macht.

Also ich wollte dir sicher kein "mangelndes Verständnis" unterstellen.

----------

## moe

Aber ich gebe zu, deinen Post nich genau gelesen zu haben, sonst hätte ich ja gewusst, dass du weißt, dass die Bash das macht und nicht echo.  :Wink: 

----------

