Linux Bash Script, lệnh đơn nhưng nhiều dòng?


97

Tôi có đoạn script sau đây mà tôi đã viết bằng cách tìm kiếm Google và nó sao lưu hệ thống Linux của tôi vào kho lưu trữ:

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

Điều này hoạt động, nhưng tôi tự hỏi nếu tôi có thể định dạng tập lệnh để hiển thị lệnh trên nhiều dòng, một cái gì đó như thế này, để dễ dàng chỉnh sửa sau này:

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 
/

Bằng cách đó, nó dễ dàng hơn để đọc và chỉnh sửa sau này. Có thể định dạng một tập lệnh Bash theo cách này?

Câu trả lời:


130

Tất cả những gì bạn cần làm là thêm "\" vào cuối mỗi dòng và nó sẽ rất tốt để đi.

Vì vậy, của bạn sẽ trông như:

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

Một vài phím tắt

(dựa trên cập nhật nhận xét của bạn để đặt $ HOSTNAME)

$HOSTNAME

Hai tùy chọn để thiết lập:

  1. Đặt HOSTNAME

    HOSTNAME = $ (tên máy chủ)

  2. Sử dụng thay thế lệnh (ví dụ $(command))

    Vì vậy, nó sẽ trông giống như ở trên. Điều đó chỉ làm cho lệnh chạy trước khi sử dụng nó.

$DATE

Một biến khác tránh được sẽ dễ dàng:

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

$ man date sẽ có các định dạng cho các tùy chọn ngày, ở trên là YYYYmmdd


Cảm ơn các bạn. Một điều cuối cùng. Dường như có vấn đề với phần tên tệp trong tập lệnh của tôi: $ HOSTNAME_ $ DATE.tar.gz Khi tôi chạy tập lệnh ngay bây giờ, tệp đầu ra là: 20121120.tar.gz
Jay LaCroix

Nếu bạn muốn "tên máy chủ" thực sự của mình đặt lại vào dấu tick (phím dấu ngã "~" phía trên tab): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller

Bất cứ lúc nào @JayLaCroix - Chào mừng bạn đến với SU!
nerdwaller

1
Đó là khuyến cáo để sử dụng $(command)thay vì `command`.
andrybak

9

Sử dụng dấu gạch chéo ngược để tiếp tục lệnh trên dòng tiếp theo:

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

Đăng nó @Paul! Chỉ cần đánh bại tôi: D
nerdwaller

@nerdwaller Heh, tôi nghĩ bạn đã vào trước!
Paul

Tôi đã quay lại để cập nhật nó để làm cho nó hữu ích hơn và nhận được các vết lõm. Tôi yêu SU mặc dù, bởi và lớn.
nerdwaller

Điều này không làm việc cho tôi như ví dụ. trongalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefDefist

1
@TheDefDefist Nghe có vẻ như là một vấn đề khác với vấn đề này. Có lẽ mở một câu hỏi mới?
Paul

5

Lệnh tương tự, nhưng với các nhận xét cho mỗi dòng, sẽ là:

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 \
    /
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.