Aufgabe 1

#! /usr/local/bin/bash

sep=`head -1 $1.header`
mail_txt=$2
subject=$3

SELECT $1 login Name | {
   IFS="$sep"
   while read line; do
      set $line
      addr=$1
      shift
      sed "s/#1/$1/g" $mail_txt > /tmp/$$.mail
      mail -s "$subject" $addr < /tmp/$$.mail
      echo "sent to $1, at $addr"
   done
   }

Aufgabe 2

#! /usr/local/bin/bash

table="$1"
lock=${table}.lock
ret=`head -3 ${table}.header | {
        read line; echo "sep=$line"
        read line; echo "attr=$line"
        read line; echo "keys=$line"
        }`
eval $ret
shift

#Anzahl der Attribute pruefen
c_attr=`
   ( IFS=$sep; set $attr; echo -n $#)
   `
if [ $# -ne $c_attr ]; then
   echo $c_attr $#
   echo "Falsche Anzahl der Attribute"
   exit 1
fi                

#Lock erzeugen, exit 3, falls Datei gesperrt
ln -s $table $lock 2>/dev/null
if [ $? -ne 0 ]; then
   echo "$table: gesperrt"
   exit 3
fi

#Wenn hier was schief laeuft, darf das Skript nicht sofort terminieren,
#da sonst der LOCK nicht entfernt wird
(
   #Existiert der Schluessel schon
   new_row=""
   for i; do
      new_row="$new_row${new_row:+$sep}$i"
   done

   new_key=`
      echo $new_row | { IFS="$IFS$sep"; SELECT $table $keys; }
      `
   { IFS="$IFS$sep"; SELECT $table $keys; }| grep "^$new_key\$" > /dev/null
   if [ $? -eq 0 ]; then
      echo "Datensatz mit gleichem Schlüssel existiert"       
      exit 2
   fi

   #Neue Zeile einfuegen
   if [ -s ${table}.data ]; then
      echo $new_row >> ${table}.data
   else
      echo $new_row > ${table}.data
   fi
)
exit_code="$?"

#Tabelle freigeben
rm -f $lock
exit $exit_code

Aufgabe 3

#! /usr/local/bin/bash

tablename=$1
trenner=$2
shift 2

attr=""
keys=""

for i; do
   if [ ${i:0:1} = "-" ]; then
      keys="$keys${keys:+$trenner}${i#\-}"
   fi
   attr="$attr${attr:+$trenner}${i#\-}"
done

{ echo "$trenner"; echo "$attr"; echo "$keys"; } > ${tablename}.header

Aufgabe 4

#! /usr/local/bin/bash

sep="$2"

ret=`(
  IFS=".=$IFS"
  set $1
  echo "tab1=$1; j1=$2; tab2=$3; j2=$4"
  ) `
eval $ret

j1=`CR_INDEX ${tab1}.header  | grep "^\W$j1" | cut -f 3 `
j2=`CR_INDEX ${tab2}.header | grep "^\W$j2" | cut -f 3 `
shift 2

for i; do
   sp=`CR_INDEX ${i%.*}.header | grep "^\W${i#*.}" | cut -f 3`
   if [ ${i%.*} = $tab1 ]; then
      sp="1.$sp"
   else
      sp="2.$sp"
   fi
   f="$f${f:+ }$sp"                                 
done

sep_tab1=`head -1 ${tab1}.header`
cat ${tab1}.data | tr "$sep_tab1" "$sep" |
  sort -t "$sep" -k $j1 > /tmp/$$.f1

sep_tab2=`head -1 ${tab2}.header`
cat ${tab2}.data | tr "$sep_tab2" "$sep" |
   sort -t "$sep" -k $j2 > /tmp/$$.f2

join -t "$sep" -j1 $j1 -j2 $j2 -o $f /tmp/$$.f1 /tmp/$$.f2


Michael Lehn 5/20/1999