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?

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


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

¡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 \
    /
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.