<Precedenti | Contenuti | Succ.>
Qui Documenti
Abbiamo esaminato due metodi diversi per l'output del nostro testo, entrambi utilizzando il eco com
mand. C'è una terza via chiamata a qui documento or qui lo scriptUn here document è un'ulteriore forma di reindirizzamento I/O in cui incorporiamo un corpo di testo nel nostro script e lo immettiamo nell'input standard di un comando. Funziona così:
command << token
testo
token
where command è il nome del comando che accetta input standard e token è una stringa utilizzata per indicare la fine del testo incorporato. Modificheremo il nostro script per utilizzare un documento here:
#! / Bin / bash
# Programma per generare una pagina di informazioni di sistema
TITLE="Rapporto sulle informazioni di sistema per $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generato $CURRENT_TIME, da $USER"
gatto << _EOF_
$TITLE
$TITLE
$TIMESTAMP
_EOF_
#! / Bin / bash
# Programma per generare una pagina di informazioni di sistema
TITLE="Rapporto sulle informazioni di sistema per $HOSTNAME" CURRENT_TIME=$(date +"%x %r %Z")
TIMESTAMP="Generato $CURRENT_TIME, da $USER"
gatto << _EOF_
$TITLE
$TITLE
$TIMESTAMP
_EOF_
Invece di usare eco, il nostro script ora utilizza gatto e un documento here. La stringa _EOF_ (che significa "Fine del file", una convenzione comune) è stato selezionato come token e indica la fine del testo incorporato. Si noti che il token deve apparire da solo e che non devono esserci spazi finali sulla riga.
Quindi qual è il vantaggio di usare un documento here? È più o meno lo stesso di eco, tranne per il fatto che, per impostazione predefinita, le virgolette singole e doppie all'interno dei documenti here perdono il loro significato speciale per la shell. Ecco un esempio di riga di comando:
[io@linuxbox~]$ foo="del testo"
[io@linuxbox~]$ gatto << _EOF_
> $ foo
[io@linuxbox~]$ foo="del testo"
[io@linuxbox~]$ gatto << _EOF_
> $ foo
> "$foo"
> '$foo'
> \$foo
> _EOF_ un po' di testo "un po' di testo" 'un po' di testo'
$ foo
> "$foo"
> '$foo'
> \$foo
> _EOF_ un po' di testo "un po' di testo" 'un po' di testo'
$ foo
Come possiamo vedere, la shell non presta attenzione alle virgolette. Le tratta come caratteri normali. Questo ci permette di incorporare liberamente le virgolette in un here document. Questo potrebbe rivelarsi utile per il nostro programma di reportistica.
I documenti here possono essere utilizzati con qualsiasi comando che accetti input standard. In questo esempio, utilizziamo un documento here per passare una serie di comandi al FTP programma per recuperare un file da un server FTP remoto:
#! / Bin / bash
# Script per recuperare un file tramite 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_ apri $FTP_SERVER
utente anonimo me@linuxbox cd $FTP_PATH
hash
ricevi $REMOTE_FILE ciao
_EOF_
ls -l $FILE_REMOTO
#! / Bin / bash
# Script per recuperare un file tramite 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_ apri $FTP_SERVER
utente anonimo me@linuxbox cd $FTP_PATH
hash
ricevi $REMOTE_FILE ciao
_EOF_
ls -l $FILE_REMOTO
Se modifichiamo l'operatore di reindirizzamento da "<<" a "<<-", la shell ignorerà i caratteri di tabulazione iniziali nel documento here. Questo consente di indentare un documento here, migliorandone la leggibilità:
#! / Bin / bash
# Script per recuperare un file tramite FTP FTP_SERVER=ftp.nl.debian.org
#! / Bin / bash
# Script per recuperare un file tramite 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_ apri $FTP_SERVER
utente anonimo me@linuxbox cd $FTP_PATH
hash
ricevi $REMOTE_FILE ciao
_EOF_
ls -l $FILE_REMOTO
FTP_PATH=/debian/dists/lenny/main/installer-i386/current/images/cdrom REMOTE_FILE=debian-cd_info.tar.gz
ftp -n <<- _EOF_ apri $FTP_SERVER
utente anonimo me@linuxbox cd $FTP_PATH
hash
ricevi $REMOTE_FILE ciao
_EOF_
ls -l $FILE_REMOTO