Linux Bash Script, одна команда, но несколько строк?

90

У меня есть следующий сценарий, который я написал в поиске 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 таким образом?

Джей Лакруа
источник

Ответы:

121

Все, что вам нужно сделать, это добавить «\» в конце каждой строки, и это должно быть хорошо.

Так что ваш будет выглядеть так:

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 = $ (имя хоста)

  2. Используйте подстановку команд (например $(command))

    Так будет выглядеть выше. Это просто заставляет команду работать перед использованием.

$DATE

Другой переменной, которую можно избежать, будет легко:

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

$ man date будут иметь форматы для параметров даты, выше YYYYmmdd

nerdwaller
источник
Спасибо, парни. Последняя вещь. Кажется, есть проблема с частью имени моего сценария с именем файла: $ HOSTNAME_ $ DATE.tar.gz Когда я сейчас запускаю сценарий, выходной файл: 20121120.tar.gz
Jay
Если вы хотите, чтобы ваше фактическое «имя хоста» ставилось в обратном тике (тильда «~» над вкладкой): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller
В любое время @JayLaCroix - Добро пожаловать в SU!
nerdwaller
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 \
/
Павел
источник
Черт возьми @ Пол! Просто бей меня: 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 \
    /
Альтер Лагос
источник