#!/bin/sh
#
# feldweise Ausgabe der Einträge (Zeilen) der /etc/passwd in 2 Formaten
#
# Aufruf:
#   ./passwd_ausgabe.sh </etc/passwd
#   ./passwd_ausgabe.sh /tmp/ausgabe </etc/passwd
#
# Das optionale Argument 1 benennt die Ausgabe-Datei für Format 2. Standard ist
# /dev/stderr.
#
# 4.3.2006

# die Bezeichnungen der Felder von /etc/passwd
feld_namen="name password uid gid real_name home_dir shell"

# maximale Länge der Feldbezeichnungen ermitteln
for f in $feld_namen
do
  # das wäre mittels eines externen Kommandos möglich:
  #len=$(echo -n $f | wc -c)
  # die Bash kann das aber auch selbst
  len=${#f}
  ((len > maxlen)) && maxlen=$len
done

# Ausgabe-File für Ausgabe-Format 2
if [[ $1 ]]
then
  # in $1 wurde eine Ausgabe-Datei vorgegeben
  out_file_2=$1
  echo "Ausgabe-Datei: $out_file_2"
  # evtl. existierendes Ausgabe-File löschen
  rm -f "$out_file_2"
else
  # ohne Vorgabe verwenden wir stderr
  out_file_2=/dev/stderr
fi

# den für das Ausgabe-Format 2 benötigten Format-String für das Kommando
# "printf" zusammensetzen; maximale Länge der Feldbezeichnungen verwenden
fmt="%-${maxlen}s: %s\n"

# Trenner für Ausgabe-Format 1
trenner='-->'

# Ausgabe einer Zeile
# $1 --> Format-Angabe (1 für Format 1, sonst: Format 2)
function ausgabe()
{
  # Nummer des Eintrags (der Zeile) ausgeben
  echo "Eintrag $zeile"
  # Feldindex initialisieren
  cnt=0
  # Felder durchlaufen
  for f in $feld_namen
  do
    if (($1 == 1))
    then
      # Ausgabe im Format 1
      echo "$f $trenner ${felder[$cnt]}"
    else
      # Ausgabe im Format 2
      printf "$fmt" "$f" "${felder[$cnt]}"
    fi
    # Feldindex inkrementieren
    ((cnt++))
  done
  echo '========================================================='
}

# Zeilenzähler initialisieren
zeile=1

# alten Wert von $IFS merken
ORIG_IFS=$IFS

# IFS auf den Doppelpunkt setzen, weil dies der Trenner der Felder der passwd
# ist
IFS=:

# Daten in einer Schleife von stdin in ein Array einlesen
while read -a felder
do
  # IFS auf alten Wert setzen, um das Skript normal interpretieren zu lassen
  IFS=$ORIG_IFS
  # Ausgabe in den Formaten 1 und 2
  ausgabe 1
  ausgabe 2 >> "$out_file_2"
  # Zeilenzähler inkrementieren
  ((zeile++))
  # IFS für read wieder auf den Doppelpunkt setzen
  IFS=:
done

