Linux Bash Script, однокомандна, але кілька рядків?


89

У мене є такий сценарій, який я написав за допомогою пошуку в Google, і він створює резервну копію моєї системи Linux в архіві:

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

Це працює, але мені цікаво, чи зможу я відформатувати сценарій, щоб показати команду в декількох рядках, щось подібне, тому це легко редагувати пізніше:

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 
/

Таким чином простіше читати та редагувати пізніше. Чи можливо форматувати сценарій Bash таким чином?

Відповіді:


118

Все, що вам потрібно зробити, - це додати "\" в кінці кожного рядка, і слід добре пройти.

Так ваше буде виглядати так:

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

Трохи ярликів

(на основі оновлення ваших коментарів для встановлення $ HOSTNAME)

$HOSTNAME

Два варіанти встановити це:

  1. Встановити HOSTNAME

    HOSTNAME = $ (ім'я хоста)

  2. Використовувати заміну команд (наприклад $(command))

    Так би виглядало вище. Це просто змушує команду виконуватись перед її використанням.

$DATE

Інша змінна, яку можна уникнути, буде легко:

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

$ man date матимуть формати параметрів дати, вище - YYYYmmdd


Спасибі, хлопці. Одне останнє. Здається, є проблема з частиною імені файлу мого сценарію: $ HOSTNAME_ $ DATE.tar.gz Коли я запускаю сценарій зараз, вихідний файл: 20121120.tar.gz
Jay LaCroix

Якщо ви хочете, щоб ваше власне ім’я хоста було поміщено в тики (клавіша "~" вище вкладки): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller

У будь-який час @JayLaCroix - Ласкаво просимо до SU!
бовдур

1
Він рекомендується використовувати $(command)замість `command`.
andrybak

9

Використовуйте зворотний нахил для продовження команди в наступному рядку:

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

Пограв @Paul! Просто побили мене: D
nerdwaller

@nerdwaller Хе, я подумав, що твій першим потрапив!
Павло

Я повернувся до оновлення, щоб зробити його кориснішим і отримати відступи. Я люблю SU, але, за великим рахунком.
nerdwaller

Це не працює для мене, як, наприклад, вalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist

1
@TheDefinitionist Здається, що ця проблема є іншою. Можливо, відкриєте нове запитання?
Пол

5

Ця ж команда, але з коментарями до кожного рядка, буде:

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 \
    /
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.