Linux Bash Script, Perintah Tunggal Tapi Banyak Baris?

98

Saya memiliki skrip berikut yang saya tulis dengan mencari Google, dan mencadangkan sistem Linux saya ke arsip:

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

Ini berfungsi, tetapi saya bertanya-tanya apakah saya dapat memformat skrip untuk menampilkan perintah melalui beberapa baris, seperti ini, sehingga mudah untuk diedit nanti:

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 
/

Dengan begitu lebih mudah untuk membaca dan mengedit nanti. Apakah mungkin untuk memformat skrip Bash dengan cara ini?

Jay LaCroix
sumber

Jawaban:

131

Yang harus Anda lakukan adalah menambahkan "\" di akhir setiap baris dan itu harus baik.

Jadi milikmu akan terlihat seperti:

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

Beberapa Pintasan

(berdasarkan pembaruan komentar Anda untuk menetapkan $ HOSTNAME)

$HOSTNAME

Dua opsi untuk mengatur itu:

  1. Setel HOSTNAME

    HOSTNAME = $ (nama host)

  2. Gunakan substitusi perintah (mis. $(command))

    Jadi akan terlihat seperti di atas. Itu hanya membuat perintah dijalankan sebelum menggunakannya.

$DATE

Variabel lain yang dihindari akan mudah:

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

$ man date akan memiliki format untuk opsi tanggal, di atas adalah YYYYmmdd

nerdwaller
sumber
Terima kasih kawan Satu hal terakhir. Tampaknya ada masalah dengan bagian nama file dari skrip saya: $ HOSTNAME_ $ DATE.tar.gz Ketika saya menjalankan skrip sekarang, file outputnya adalah: 20121120.tar.gz
Jay LaCroix
Jika Anda ingin "hostname" Anda yang sebenarnya memasukkannya ke dalam tick back (tilde "~" tab di atas): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller
Anytime @JayLaCroix - Selamat Datang di SU!
nerdwaller
1
Hal ini dianjurkan untuk menggunakan $(command)bukan `command`.
andrybak
10

Gunakan garis miring terbalik untuk melanjutkan perintah pada baris berikutnya:

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 \
/
Paul
sumber
Dang it @Paul! Kalahkan saja saya: D
nerdwaller
@nerdwaller Heh, saya pikir Anda masuk duluan!
Paul
Saya kembali untuk memperbaruinya agar lebih bermanfaat dan mendapatkan lekukan. Saya suka SU, pada umumnya.
nerdwaller
Ini tidak bekerja untuk saya seperti misalnya. inalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist
1
@TheDefinitionist Kedengarannya seperti masalah yang berbeda dengan yang ini. Mungkin membuka pertanyaan baru?
Paul
5

Perintah yang sama, tetapi dengan komentar untuk setiap baris, adalah:

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 \
    /
Alter Lagos
sumber