Linux Bash Script, jedno polecenie, ale wiele linii?

97

Mam następujący skrypt, który napisałem, wyszukując w Google, i tworzy kopię zapasową mojego systemu Linux w archiwum:

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

To działa, ale zastanawiam się, czy mogę sformatować skrypt, aby wyświetlał polecenie w wielu wierszach, coś w tym stylu, więc łatwo jest później edytować:

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 
/

W ten sposób łatwiej jest później czytać i edytować. Czy można sformatować skrypt Bash w ten sposób?

Jay LaCroix
źródło

Odpowiedzi:

129

Wszystko, co musisz zrobić, to dodać „\” na końcu każdego wiersza i powinno być dobrze.

Twój będzie wyglądał następująco:

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

Kilka skrótów

(na podstawie aktualizacji komentarza dotyczącej ustawienia $ HOSTNAME)

$HOSTNAME

Dwie opcje, aby to ustawić:

  1. Ustaw HOSTNAME

    NAZWA HOSTA = $ (nazwa hosta)

  2. Użyj podstawienia polecenia (np. $(command))

    Tak by wyglądało jak wyżej. To sprawia, że ​​polecenie jest uruchamiane przed użyciem.

$DATE

Inną zmienną, której można by uniknąć, byłoby łatwo:

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

$ man date będą miały formaty opcji daty, powyższy to RRRRmmdd

nerdwaller
źródło
Dzięki chłopaki. Ostatnia rzecz. Wygląda na to, że występuje problem z częścią nazwy pliku mojego skryptu: $ HOSTNAME_ $ DATE.tar.gz Kiedy teraz uruchamiam skrypt, plik wyjściowy to: 20121120.tar.gz
Jay LaCroix
Jeśli chcesz, aby twoja rzeczywista „nazwa hosta” wstawiła ją z powrotem (tylda „~” nad zakładką): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller
W dowolnym momencie @JayLaCroix - Witamy w SU!
nerdwaller
1
Jest zalecane , aby użyć $(command)zamiast `command`.
andrybak
9

Użyj ukośnika odwrotnego, aby kontynuować polecenie w następnym wierszu:

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 \
/
Paweł
źródło
Dang it @Paul! Po prostu mnie pobij: D
nerdwaller
@nerdwaller Heh, myślałem, że twój dostał się pierwszy!
Paul
Wróciłem, aby go zaktualizować, aby był bardziej użyteczny i uzyskać wcięcia. Ogólnie kocham SU.
nerdwaller
To nie działa dla mnie jak np. inalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist
1
@ TheDefinitionist Brzmi jak inny problem niż ten. Być może otworzyć nowe pytanie?
Paul
5

To samo polecenie, ale z komentarzami dla każdej linii, brzmiałoby:

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
źródło