# Bashprogrammierung



## chrian (27. Oktober 2010)

Hi,
als erstes mal ein großes Lob an diese Community. bin hier schon Länger als Leser unterwegs und habe jetzt leider ein kleines Problem.
Ich hoffe ihr könnt mir helfen:

ich möchte ein Shell-Skript schreiben, das erkennt von welchem Typ eine Datei (Dateiname über Eingabeaufforderung in der Konsole) ist und eine textdatei ausgibt, bzw. eine Zip-Datei entpackt. mein Problem ist einfach, dass ich den If-Fall nicht hinbekomme.

Danke im Voraus,
gruß
Christian


----------



## sheel (27. Oktober 2010)

Hilft dir das vllt.?


```
if [ -z "${FILE_PATH##*.gpg}" -a $FILE_PATH != ".gpg" ]; then...
```


----------



## deepthroat (27. Oktober 2010)

Hi.

Für Fallunterscheidungen eignet sich meist ein case besser:

```
case "$FILENAME" in
*.txt )
  echo Textdatei
  ;;
*.zip | *.jar )
  echo Zip-Datei
  ;;
* )
  echo unbekannte Datei
  ;;
esac
```
Gruß


----------



## Bratkartoffel (27. Oktober 2010)

Hallo chrian und Herzlich Willkommen als Mitglied hier bei tutorials.de 

Den Typ einer Datei erfährst du im Linux Bereich mit Hilfe des Programms "file".
Hier mal ein Beispiel, wie du das verwenden kannst:

```
$> file /root/textdatei 
/root/textdatei: UTF-8 Unicode text

$> file info.png 
info.png: PNG image, 128 x 128, 8-bit/color RGBA, non-interlaced
```

Das Programm geht nicht nur über die Dateiendung, sondern auch über die sogenannten "File Signature Bytes".

Benutzereingaben liest du ja in einem Shellscript über "read" ein, hier ein kleines Beispiel:

```
$> read test
servus
$> echo $test
servus
```

Um nun herauszufinden, welchen Dateityp die Eingabe hat, kannst du die Eingabe an das Programm "file" geben und danach abfragen, was da drin steht. Da das "file" verschiedene Details bei gleichen Dateitypen ausgeben kann, würde ich dir empfehlen das Ganze zum Beispiel mit "grep" etwas zu generalisieren.


```
#/bin/bash

echo -n "Dateiname: "
read eingabe

if [ ! -e "$eingabe" ]; then
  echo "Datei existiert nicht!" >&2
  exit 1
fi

typ=$( file "$eingabe" )
if [ ! -z "$( echo "$typ" | grep -i "text" )" ]; then
  echo "Es ist eine Textdatei."
fi

if [ ! -z "$( echo "$typ" | grep -i "png" )" ]; then
  echo "Es ist ein Bild (PNG)."
fi

exit 0
```

Das für dich noch interessant "zip" liefert bei mir folgende Ausgabe:

```
$> file build.zip 
build.zip: Zip archive data, at least v2.0 to extract
```

Baue diesen Fall in mein obiges Beispiel ein, dann sollte es funktionieren.

Gruß
BK


----------



## deepthroat (27. Oktober 2010)

Hi.

Wenn du nicht über die Dateiendung, sondern direkt über den Dateityp gehen willst, dann ist es meist besser (bzw. einfacher) den MIME-Type zu verwenden:

```
case $(file -bi "$FILENAME")
text/*)
  echo TextDatei
  ;;
image/png)
  echo PNG Datei
  ;;
image/*)
  echo PNG, BMP, JPEG, GIF etc.
  ;;
esac
```
Gruß


----------

