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.