Question Linux Bash Script, Commande unique mais plusieurs lignes?


J'ai écrit le script suivant en effectuant une recherche sur Google et il sauvegarde mon système Linux dans 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, quelque chose comme ça, il est donc facile de l'éditer plus tard:

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


65
2017-11-21 03:09


origine




Réponses:


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

Donc, le votre 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
(basé sur la mise à jour de vos commentaires pour définir $ HOSTNAME)

$ HOSTNAME

Deux options pour définir cela:

1) Définir NOM HÔTE

HOSTNAME = $ (nom d'hôte)

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

Donc, ça ressemblerait à ci-dessus. Cela ne fait que lancer 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 précède est AAAAmmdd


80
2017-11-21 03:14



Merci les gars. Une dernière chose. Il semble y avoir un problème avec la portion de nom de fichier de mon script: $ HOSTNAME_ $ DATE.tar.gz Lorsque je lance le script maintenant, le fichier de sortie est: 20121120.tar.gz - Jay LaCroix
Si vous souhaitez que votre "nom d'hôte" soit mis à zéro (le tilde "~", touche ci-dessus): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz - nerdwaller
Anytime @JayLaCroix - Bienvenue sur SU! - nerdwaller
C'est conseillé utiliser $(command) au lieu de `command`. - andrybak


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

7
2017-11-21 03:15



Dang it @ Paul! Juste me battre: D - nerdwaller
@nerdwaller Heh, je pensais que vous aviez la première! - Paul
Je suis retourné le mettre à jour pour le rendre plus utile et obtenir les indentations. J'aime beaucoup SU, dans l'ensemble. - nerdwaller
Cela ne fonctionne pas pour moi, par exemple. dans alias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."'; - TheDefinitionist
@TheDefinitionist Sonne comme un problème différent de celui-ci. Peut-être ouvrir une nouvelle question? - Paul


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

1
2018-01-17 22:03