Linux Bash Script, comando único pero varias líneas?

98

Tengo el siguiente script que escribí buscando en Google, y hace una copia de seguridad de mi sistema Linux en un archivo:

#!/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 /

Esto funciona, pero me pregunto si puedo formatear el script para mostrar el comando en varias líneas, algo así, por lo que es fácil de editar más tarde:

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 
/

De esa manera es más fácil leer y editar más tarde. ¿Es posible formatear un script Bash de esta manera?

Jay LaCroix
fuente

Respuestas:

131

Todo lo que debe hacer es agregar "\" al final de cada línea y debería estar listo.

Entonces el suyo se verá así:

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 \
    /

Unos atajos

(según su actualización de comentarios para configurar $ HOSTNAME)

$HOSTNAME

Dos opciones para configurar eso:

  1. Establecer HOSTNAME

    HOSTNAME = $ (nombre de host)

  2. Usar sustitución de comando (p $(command). Ej. )

    Entonces se vería como arriba. Eso solo hace que el comando se ejecute antes de usarlo.

$DATE

Otra variable evitada sería fácilmente:

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

$ man date tendrá los formatos para las opciones de fecha, lo anterior es AAAAMMdd

nerdwaller
fuente
Gracias chicos. Una última cosa. Parece que hay un problema con la parte del nombre del archivo de mi script: $ HOSTNAME_ $ DATE.tar.gz Cuando ejecuto el script ahora, el archivo de salida es: 20121120.tar.gz
Jay LaCroix
Si usted quiere que su "nombre de host" real ponerlo en la parte trasera garrapatas (la tilde "~" clave anterior pestaña): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller
En cualquier momento @JayLaCroix - ¡Bienvenido a SU!
nerdwaller
1
Se recomienda usar en $(command)lugar de `command`.
andrybak
10

Use la barra invertida para continuar un comando en la siguiente línea:

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 \
/
Pablo
fuente
¡Dang it @Paul! Simplemente
bátame
@nerdwaller Heh, ¡pensé que el tuyo entró primero!
Paul
Volví a actualizarlo para hacerlo más útil y obtener las hendiduras. Sin embargo, me encanta SU, en general.
nerdwaller
Esto no funciona para mí como, por ejemplo. enalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist
1
@ TheDefinitionist Suena como un problema diferente a este. ¿Quizás abrir una nueva pregunta?
Paul
5

El mismo comando, pero con comentarios para cada línea, sería:

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 \
    /
Alter Lagos
fuente