Hier documenten
We hebben gekeken naar twee verschillende methoden om onze tekst uit te voeren, beide met behulp van de echo com
mand. Er is een derde manier, genaamd a hier document or hier script. Een here-document is een aanvullende vorm van I/O-omleiding waarbij we een tekstgedeelte in ons script insluiten en dit in de standaardinvoer van een commando invoeren. Het werkt als volgt:
commando << teken
tekst
teken
WAAR commando is de naam van het commando dat standaardinvoer accepteert en teken is een tekenreeks die wordt gebruikt om het einde van de ingesloten tekst aan te geven. We zullen ons script aanpassen om een hier-document te gebruiken:
#! / Bin / bash
# Programma om een systeeminformatiepagina uit te voeren
TITLE="Systeeminformatierapport voor $HOSTNAME" CURRENT_TIME=$(datum +"%x %r %Z")
TIMESTAMP="$CURRENT_TIME gegenereerd, door $USER"
kat << _EOF_
$TITEL
$TITEL
$TIJDSTAMP
_EOF_
#! / Bin / bash
# Programma om een systeeminformatiepagina uit te voeren
TITLE="Systeeminformatierapport voor $HOSTNAME" CURRENT_TIME=$(datum +"%x %r %Z")
TIMESTAMP="$CURRENT_TIME gegenereerd, door $USER"
kat << _EOF_
$TITEL
$TITEL
$TIJDSTAMP
_EOF_
In plaats van gebruiken echo, ons script gebruikt nu hoe en een hier-document. De snaar _EOF_ (wat 'Einde van het bestand' betekent, een gebruikelijke conventie) werd geselecteerd als token en markeert het einde van de ingesloten tekst. Houd er rekening mee dat het token alleen moet verschijnen en dat er geen spaties achteraan op de regel mogen staan.
Dus wat is het voordeel van het gebruik van een hier-document? Het is grotendeels hetzelfde als echo, behalve dat enkele en dubbele aanhalingstekens in deze documenten standaard hun speciale betekenis aan de shell verliezen. Hier is een voorbeeld van een opdrachtregel:
[ik@linuxbox ~]$ foo = "een stukje tekst"
[ik@linuxbox ~]$ kat << _EOF_
> $ foo
[ik@linuxbox ~]$ foo = "een stukje tekst"
[ik@linuxbox ~]$ kat << _EOF_
> $ foo
> "$foe"
> '$ foo'
> \$foe
> _EOF_ wat tekst "wat tekst" 'wat tekst'
$ foo
> "$foe"
> '$ foo'
> \$foe
> _EOF_ wat tekst "wat tekst" 'wat tekst'
$ foo
Zoals we kunnen zien, besteedt de shell geen aandacht aan de aanhalingstekens. Het behandelt ze als gewone karakters. Hierdoor kunnen we citaten vrij in een here-document insluiten. Dit zou handig kunnen zijn voor ons rapportprogramma.
Hier kunnen documenten worden gebruikt met elk commando dat standaardinvoer accepteert. In dit voorbeeld gebruiken we een here-document om een reeks opdrachten door te geven aan de ftp programma om een bestand op te halen van een externe FTP-server:
#! / Bin / bash
# Script om een bestand op te halen via FTP FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz
ftp -n << _EOF_ opent $FTP_SERVER
gebruiker anoniem mij@linuxbox cd $FTP_PATH
hachee
ontvang $REMOTE_FILE tot ziens
_EOF_
ls -l $REMOTE_FILE
#! / Bin / bash
# Script om een bestand op te halen via FTP FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz
ftp -n << _EOF_ opent $FTP_SERVER
gebruiker anoniem mij@linuxbox cd $FTP_PATH
hachee
ontvang $REMOTE_FILE tot ziens
_EOF_
ls -l $REMOTE_FILE
Als we de omleidingsoperator wijzigen van “<<” in “<<-”, negeert de shell leidende tabtekens in het here-document. Hierdoor kan een here-document worden ingesprongen, wat de leesbaarheid kan verbeteren:
#! / Bin / bash
# Script om een bestand op te halen via FTP FTP_SERVER=ftp.nl.debian.org
#! / Bin / bash
# Script om een bestand op te halen via FTP FTP_SERVER=ftp.nl.debian.org
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz
ftp -n <<- _EOF_ open $FTP_SERVER
gebruiker anoniem mij@linuxbox cd $FTP_PATH
hachee
ontvang $REMOTE_FILE tot ziens
_EOF_
ls -l $REMOTE_FILE
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz
ftp -n <<- _EOF_ open $FTP_SERVER
gebruiker anoniem mij@linuxbox cd $FTP_PATH
hachee
ontvang $REMOTE_FILE tot ziens
_EOF_
ls -l $REMOTE_FILE