Script Bash Linux, comando único, mas várias linhas?

97

Eu tenho o seguinte script que escrevi pesquisando no Google e ele faz backup do meu sistema Linux em um arquivo:

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

Isso funciona, mas estou me perguntando se posso formatar o script para mostrar o comando em várias linhas, algo como isso, por isso é fácil editar mais 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 
/

Dessa forma, é mais fácil ler e editar mais tarde. É possível formatar um script Bash dessa maneira?

Jay LaCroix
fonte

Respostas:

130

Tudo o que você precisa fazer é adicionar "\" no final de cada linha e deve ser bom ir.

Então o seu será parecido com:

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

Alguns atalhos

(com base na atualização de comentários para definir $ HOSTNAME)

$HOSTNAME

Duas opções para definir isso:

  1. Definir HOSTNAME

    HOSTNAME = $ (nome do host)

  2. Use substituição de comando (por exemplo $(command))

    Então, seria semelhante acima. Isso apenas faz com que o comando seja executado antes de usá-lo.

$DATE

Outra variável evitada seria facilmente:

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

$ man date terá os formatos para as opções de data, o acima é AAAAMmmdd

nerdwaller
fonte
Obrigado rapazes. Uma última coisa. Parece haver um problema com a parte do nome do arquivo do meu script: $ HOSTNAME_ $ DATE.tar.gz Quando executo o script agora, o arquivo de saída é: 20121120.tar.gz
Jay LaCroix
Se você quiser o seu "nome de host" real, coloque-o nas costas (a tecla "~" acima da guia): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller 21/11/2012
Anytime @JayLaCroix - Bem-vindo ao SU!
Nerdwaller
11
É recomendável usar em $(command)vez de `command`.
precisa saber é o seguinte
9

Use a barra invertida para continuar um comando na próxima linha:

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 \
/
Paulo
fonte
Dang it @Paul! Apenas me derrote: D
nerdwaller
@nerdwaller Heh, eu pensei que o seu entrou primeiro!
Paul
Voltei a atualizá-lo para torná-lo mais útil e obter os recuos. Eu amo SU, no entanto, em geral.
Nerdwaller
Isso não funciona para mim como por exemplo. emalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist
11
@ TheDefinitionist Parece um problema diferente para este. Talvez abrir uma nova pergunta?
Paul
5

O mesmo comando, mas com comentários para cada linha, seria:

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
fonte