Linux Bash Script, comando singolo ma più righe?


98

Ho il seguente script che ho scritto cercando in Google, ed esegue il backup del mio sistema Linux su un archivio:

#!/bin/bash
# init

DATE=$(date +20%y%m%d)

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz --exclude=/proc --exclude=/lost+found --exclude=/sys --exclude=/mnt --exclude=/media --exclude=/dev --exclude=/share/Archive /

Funziona, ma mi chiedo se posso formattare lo script per mostrare il comando su più righe, qualcosa del genere, quindi è facile modificarlo in seguito:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz 
--exclude=/proc 
--exclude=/lost+found 
--exclude=/sys 
--exclude=/mnt 
--exclude=/media 
--exclude=/dev 
--exclude=/share/Archive 
/

In questo modo è più facile da leggere e modificare in seguito. È possibile formattare uno script Bash in questo modo?

Risposte:


131

Tutto quello che dovresti fare è aggiungere "\" alla fine di ogni riga e dovrebbe andare bene.

Quindi il tuo sarà simile a:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz \
    --exclude=/proc \
    --exclude=/lost+found \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /

Alcune scorciatoie

(basato sull'aggiornamento del commento per l'impostazione di $ HOSTNAME)

$HOSTNAME

Due opzioni per impostarlo:

  1. Imposta HOSTNAME

    HOSTNAME = $ (hostname)

  2. Usa la sostituzione dei comandi (ad es. $(command))

    Quindi sembrerebbe sopra. Questo fa semplicemente eseguire il comando prima di usarlo.

$DATE

Un'altra variabile da evitare sarebbe facilmente:

$(hostname)_$(date +%Y%m%d).tar.gz \

$ man date avrà i formati per le opzioni di data, quanto sopra è AAAAMMGG


Grazie ragazzi. Un'ultima cosa. Sembra che ci sia un problema con la parte del nome del file del mio script: $ HOSTNAME_ $ DATE.tar.gz Quando eseguo ora lo script, il file di output è: 20121120.tar.gz
Jay LaCroix

Se vuoi il tuo vero "nome host" mettilo tra i /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
segni di spunta

Anytime @JayLaCroix - Benvenuto in SU!
nerdwaller,

1
Si consiglia di utilizzare $(command)invece di `command`.
Andrybak,

10

Utilizzare la barra rovesciata per continuare un comando sulla riga successiva:

tar -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz \
--exclude=/proc \
--exclude=/lost+found \
--exclude=/sys  \
--exclude=/mnt  \
--exclude=/media  \
--exclude=/dev \
--exclude=/share/Archive \
/

Dang it @Paul! Basta battermi: D
nerdwaller

@nerdwaller Heh, pensavo che il tuo fosse arrivato per primo!
Paul,

Sono tornato per aggiornarlo per renderlo più utile e ottenere i rientri. Adoro SU comunque, nel complesso.
nerdwaller,

Questo non funziona per me come ad es. inalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist

1
@TheDefinitionist Sembra un problema diverso da questo. Forse aprire una nuova domanda?
Paolo,

5

Lo stesso comando, ma con commenti per ogni riga, sarebbe:

tar -cvpzf /share/Recovery/Snapshots/$(hostname)_$(date +%Y%m%d).tar.gz `#first comment` \
    --exclude=/proc `#second comment` \
    --exclude=/lost+found `# and so on...` \
    --exclude=/sys \
    --exclude=/mnt \
    --exclude=/media \ 
    --exclude=/dev \
    --exclude=/share/Archive \
    /
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.