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.