253 votes

Linux Bash script, une seule commande mais plusieurs lignes ?

J'ai le script suivant que j'ai écrit en cherchant 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 ceci, afin qu'il soit facile à modifier 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 de le lire et de le modifier par la suite. Est-il possible de formater un script de Bash de cette façon ?

334voto

Adem Points 738

Il vous suffit d'ajouter "\" à la fin de chaque ligne et tout devrait être prêt.

Le vôtre ressemblera donc à ça :

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

(sur la base de la mise à jour de votre commentaire concernant la définition de $HOSTNAME)

$HOSTNAME

Deux options pour régler cela :

  1. Définir HOSTNAME

    HOSTNAME=$(nom d'hôte)

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

    Ainsi, cela ressemblerait à ce qui précède. Cela permet juste d'exécuter la commande avant de l'utiliser.

$DATE

Une autre variable à éviter serait la facilité :

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

$ man date aura les formats pour les options de date, le ci-dessus est YYYYmmdd

26voto

Oliver Points 125

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

22voto

Axel Heider Points 221

Vous pouvez utiliser ceci dans bash

PARAMS=(
    -cvpzf /share/Recovery/Snapshots/$HOSTNAME_$DATE.tar.gz 
    --exclude=`enter code here`/proc 
    --exclude=/lost+found 
    --exclude=/sys 
    --exclude=/mnt
    # this is a comment 
    --exclude=/media 
    --exclude=/dev 
    # --exclude=/something
    --exclude=/share/Archive 
    /
)
tar ${PARAMS[@]}

13voto

Alter Lagos Points 233

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

4voto

timkay Points 101

Axel Heider constitue une bonne alternative aux antislashes. Deux notes :

  1. La commande peut être incluse dans la liste, et
  2. L'utilisation de la liste doit être entre guillemets. "${PARAMS[@]}" de sorte que tout espace dans les paramètres soit préservé.

    !/bin/bash

    params=( show hello, world "multi word" )

    function show { echo --- Showing \""$@"\" as parameters --- for i in "$@"; do echo i=$i done }

    ${params[@]} "${params[@]}"

sorties

$ bash test.sh
--- Showing "hello, world multi word" as parameters ---
i=hello,
i=world
i=multi
i=word
--- Showing "hello, world multi word" as parameters ---
i=hello,
i=world
i=multi word

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X