Linux-Bash-Skript, einzelner Befehl, aber mehrere Zeilen?


97

Ich habe das folgende Skript, das ich durch Durchsuchen von Google geschrieben habe, und es sichert mein Linux-System in einem Archiv:

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

Das funktioniert, aber ich frage mich, ob ich das Skript so formatieren kann, dass der Befehl über mehrere Zeilen hinweg angezeigt wird.

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 
/

Auf diese Weise ist es später einfacher zu lesen und zu bearbeiten. Ist es möglich, ein Bash-Skript auf diese Weise zu formatieren?

Antworten:


130

Alles was Sie tun müssen, ist "\" am Ende jeder Zeile einzufügen und es sollte gut gehen.

So wird deins aussehen:

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

Ein paar Abkürzungen

(basierend auf Ihrem Kommentar-Update zum Festlegen von $ HOSTNAME)

$HOSTNAME

Zwei Optionen, um das einzustellen:

  1. Stellen Sie HOSTNAME ein

    HOSTNAME = $ (Hostname)

  2. Befehlsersetzung verwenden (zB $(command))

    So würde es oben aussehen. Dadurch wird der Befehl ausgeführt, bevor er verwendet wird.

$DATE

Eine andere Variable, die vermieden wird, wäre leicht:

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

$ man date Die Formate für die Datumsoptionen sind wie folgt: JJJJmmtt


Danke Leute. Eine letzte Sache. Es scheint ein Problem mit dem Dateinamen meines Skripts zu geben: $ HOSTNAME_ $ DATE.tar.gz Wenn ich das Skript jetzt ausführe, lautet die Ausgabedatei: 20121120.tar.gz
Jay LaCroix

Wenn du deinen tatsächlichen "Hostnamen" haben willst, setze ihn in die hinteren Häkchen (die Tilde "~" über dem Tab): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller

Jederzeit @JayLaCroix - Willkommen in SU!
Nerdwaller

1
Es wird empfohlen , $(command)anstelle von zu verwenden `command`.
Andrybak

9

Verwenden Sie den umgekehrten Schrägstrich, um einen Befehl in der nächsten Zeile fortzusetzen:

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! Schlagen Sie mich einfach: D
nerdwaller

@nerdwaller Heh, ich dachte, du bist zuerst da!
Paul

Ich ging zurück, um es zu aktualisieren, um es nützlicher zu machen und die Einrückungen zu erhalten. Ich liebe SU im Großen und Ganzen.
Nerdwaller

Das funktioniert bei mir nicht wie zB. inalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist

1
@TheDefinitionist Klingt nach einem anderen Problem als dieses. Vielleicht eine neue Frage öffnen?
Paul

5

Der gleiche Befehl, jedoch mit Kommentaren für jede Zeile, wäre:

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 \
    /
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.