Script Bash Linux, commande unique mais plusieurs lignes?

98

J'ai le script suivant que j'ai écrit en effectuant une recherche sur Google et qui sauvegarde mon système Linux sur une archive:

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

Cela fonctionne, mais je me demande si je peux formater le script pour afficher la commande sur plusieurs lignes, comme cela, afin qu'il soit facile de l'éditer ultérieurement:

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 cette façon, il est plus facile de lire et d’éditer plus tard. Est-il possible de formater un script Bash de cette façon?

Jay LaCroix
la source

Réponses:

131

Tout ce que vous devez faire est d’ajouter "\" à la fin de chaque ligne et il devrait être bon de partir.

Ainsi, le vôtre ressemblera à:

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

Quelques raccourcis

(en fonction de la mise à jour de vos commentaires pour le paramètre $ HOSTNAME)

$HOSTNAME

Deux options pour définir cela:

  1. Définir le nom d'hôte

    HOSTNAME = $ (nom d'hôte)

  2. Utiliser la substitution de commande (par exemple $(command))

    Donc, cela ressemblerait à ce qui précède. Cela fait juste exécuter la commande avant de l’utiliser.

$DATE

Une autre variable évitée serait facilement:

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

$ man date aura les formats pour les options de date, ce qui est ci-dessus est AAAAMmmjj

nerdwaller
la source
Merci les gars. Une dernière chose. Il semble y avoir un problème avec la partie nom de fichier de mon script: $ HOSTNAME_ $ DATE.tar.gz Lorsque je lance le script maintenant, le fichier de sortie est le suivant: 20121120.tar.gz
Jay LaCroix
Si vous voulez que votre "hostname" actuel le place dans les ticks (le tilde "~" au dessus de l'onglet): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller
À tout moment @JayLaCroix - Bienvenue sur SU!
nerdwaller
1
Il est recommandé d'utiliser $(command)au lieu de `command`.
andrybak
10

Utilisez la barre oblique inverse pour continuer une commande sur la ligne suivante:

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
la source
Dang it @Paul! Il suffit de me battre: D
nerdwaller
@nerdwaller Heh, je pensais que le tien était le premier!
Paul
Je suis retourné le mettre à jour pour le rendre plus utile et obtenir les indentations. J'aime SU cependant, en gros.
nerdwaller
Cela ne fonctionne pas pour moi comme par exemple. dansalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist
1
@TheDefinitionist Cela ressemble à un problème différent de celui-ci. Peut-être ouvrir une nouvelle question?
Paul
5

La même commande, mais avec des commentaires pour chaque ligne, serait:

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
la source