Bashprogrammierung

chrian

Grünschnabel
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
 
Hi.

Für Fallunterscheidungen eignet sich meist ein case besser:
Bash:
case "$FILENAME" in
*.txt )
  echo Textdatei
  ;;
*.zip | *.jar )
  echo Zip-Datei
  ;;
* )
  echo unbekannte Datei
  ;;
esac
Gruß
 
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:
Code:
$> 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:
Code:
$> 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.

Bash:
#/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:
Code:
$> 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
 
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:
Bash:
case $(file -bi "$FILENAME")
text/*)
  echo TextDatei
  ;;
image/png)
  echo PNG Datei
  ;;
image/*)
  echo PNG, BMP, JPEG, GIF etc.
  ;;
esac
Gruß
 

Neue Beiträge

Zurück