Met Googlen kom je een hoop te weten.

Er staan genoeg uitleg over here documents op het net. Maar goed, in het Nederlands misschien niet, dat weet ik niet.
Met een here-document kan je als het ware tekst doorsturen naar een commando. Het woord achter de << is het teken dat de invoer afgesloten wordt, en de regels die je ernaar tikt tot dit woord is de tekst die in het commando wordt gevoerd. In plaats van een bestand op schijf (document) kan je op deze manier direct invoer van meerdere regels in een commando invoeren (here-document). Dit wordt vaak gebruikt om bijvoorbeeld gebruiksaanwijzingen in scripts op te slaan. Bijvoorbeeld:
cat <<EOF
Dit is de gebruiksaanwijzing van een script, die uit vele regels bestaat.
Op deze manier hoef je niet alle regels van een echo commando te voorzien.
En het ziet er in de code een stuk duidelijker uit.
Maar here documenten zijn dus nog voor veel meer dingen bruikbaar.
EOF
In het geval van het write commando hoef je zo geen ctrl+d te toetsen, maar wordt het einde van de invoer dus aangegeven met het woord achter de << .
Ik heb het commando bijvoorbeeld eerder gebruikt in het volgende script om een lijst met teamleden op te slaan in het script. Ik had er niet meer aan gedacht, maar eigenlijk had ik die oplossing al eerder gebruikt dus.. Op deze manier hoef je geen apart bestand voor dergelijke data te gebruiken, maar kan je die data in een script zelf opslaan:
#!/bin/bash
# This script looks in the logfile of an irc meeting if teammembers
# were attending the meeting. The output is a wiki tekst where
# teammembers who attended are grouped by their team(s) and teams
# that were not present are also shown
# usage: irc_aanwezig pad/naar/logfile
logfile=$1
teams="Artwork Beheer Documentatie Forum Irc Prikboard Promotie Vertaal Website"
declare -A teamlist
declare -a namelistarray
function namelist
{
cat <<'EOF'
cafuego:Cafuego:Irc
DooitzedeJong:Dooitze de Jong:Artwork:Documentatie
Double12:Double12:Prikboard:Promotie
femke98:Femke98:Forum
Hannie:Hannie:Vertaal
heir4c:Heir4c:Forum
JanC:Jan Claeys:Irc
johanvd:Johanvd:Forum:Documentatie
joolz:Joolz:Irc:Vertaal
Joshua822:Joshua:Documentatie
Nunslaughter:Nunslaughter:Forum
ronnie_vd_c:Ronnie:Artwork:Promotie
seveas:Dennis:Beheer:Website
Sjoerd:Sjoerd:Forum
SWAT:SWAT:Beheer:Irc:Vertaal
testcees:Testcees:Documentatie
Thomas_de_Graaff:Thomas de Graaff:Artwork:Promotie
trijntje:trijntje:Vertaal
Vistaus:Vistaus:Forum
Wazzzaaa:Wazzzaaa:Vertaal
EOF
}
# Check if logfile is given and readable
if [[ -z $logfile ]];then
echo "Argument ontbreekt, gebruik: irc_aanwezig /pad/naar/irc/logfile"
exit 1
elif [[ ! -f "${logfile}" ]];then
echo "Logfile ${logfile} bestaat niet."
exit 1
elif [[ ! -r "${logfile}" ]];then
echo "Logfile ${logfile} is niet leesbaar."
exit 1
fi
# Check for every line in the namelist if the user is in logfile
# and if so, check if user is teammember and add user to teamlist
ifs="$IFS" #backup $IFS (internal field separator)
IFS=$'\n' #set IFS to newline
namelistarray=($(namelist)) # put namelist in array
for dataline in ${namelistarray[@]};do
ircname="${dataline%%:*}" #first item in dataline
partline="${dataline#*:}"
name=${partline%%:*} #second item in dataline
# Check if ircname user is in logfile
if [ "$(grep "<${ircname}>" $logfile)" ];then
# Check if user is member of teams
IFS=" " # Set internal field separator to space
for team in $teams;do
if [[ $dataline == *$team* ]];then
# add user to teamlist
teamlist[$team]="${teamlist[$team]}, ${name}"
fi
done
IFS=$'\n' # Set internal field separator back to newline
fi
done
IFS=$ifs #restore internal field separator
# Generate output to screen and file
rm $PWD/teamgrab.tmp
echo
echo "=== Aanwezige teams ==="
for team in $teams;do
if [ -n "${teamlist[$team]}" ];then
echo " * ${team} team (${teamlist[$team]#, })"
fi
done
echo "=== Afwezige teams ==="
for team in $teams;do
if [ -z "${teamlist[$team]}" ];then
echo " * ${team} team"|tee -a "$PWD/teamgrab.tmp"
fi
done
exit 0