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?

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


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

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 \
    /
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.