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?

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


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

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 \
    /
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.