Linux Bash Script คำสั่งเดียว แต่หลายบรรทัด?


97

ฉันมีสคริปต์ต่อไปนี้ที่ฉันเขียนโดยค้นหา Google และสำรองข้อมูลระบบ Linux ของฉันไปยังที่เก็บถาวร:

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

ใช้งานได้ แต่ฉันสงสัยว่าฉันสามารถจัดรูปแบบสคริปต์เพื่อแสดงคำสั่งผ่านหลายบรรทัดได้อย่างไรเช่นนี้ดังนั้นจึงง่ายต่อการแก้ไขในภายหลัง:

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 
/

วิธีนี้จะง่ายต่อการอ่านและแก้ไขในภายหลัง เป็นไปได้หรือไม่ที่จะจัดรูปแบบสคริปต์ Bash ด้วยวิธีนี้

คำตอบ:


129

สิ่งที่คุณต้องทำคือเพิ่ม "\" ที่ส่วนท้ายของแต่ละบรรทัดและควรจะดี

ดังนั้นคุณจะมีลักษณะดังนี้:

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

ทางลัดไม่กี่

(ขึ้นอยู่กับการอัปเดตความคิดเห็นของคุณสำหรับการตั้งค่า $ HOSTNAME)

$HOSTNAME

สองตัวเลือกในการตั้งค่าที่:

  1. ตั้ง HOSTNAME

    HOSTNAME = $ (ชื่อโฮสต์)

  2. ใช้การทดแทนคำสั่ง (เช่น$(command))

    ดังนั้นมันจะมีลักษณะดังกล่าวข้างต้น นั่นทำให้คำสั่งรันก่อนที่จะใช้

$DATE

ตัวแปรอื่นที่หลีกเลี่ยงได้ง่าย:

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

$ man date จะมีรูปแบบสำหรับตัวเลือกวันที่ข้างต้นคือ YYYYmmdd


ขอบคุณเพื่อน. สิ่งสุดท้าย. ดูเหมือนว่าจะมีปัญหากับส่วนของชื่อไฟล์ของสคริปต์ของฉัน: $ HOSTNAME_ $ DATE.tar.gz เมื่อฉันเรียกใช้สคริปต์ตอนนี้ไฟล์ที่ส่งออกคือ: 20121120.tar.gz
Jay LaCroix

หากคุณต้องการ "ชื่อโฮสต์" ตามจริงให้ใส่เครื่องหมายขีดด้านหลัง (แท็บเครื่องหมายตัวหนอน "~" ด้านบน): /share/Recovery/Snapshots/`hostname`_$DATE.tar.gz
nerdwaller

Anytime @JayLaCroix - ยินดีต้อนรับสู่ SU!
nerdwaller

1
มันเป็นเรื่องที่แนะนำให้ใช้แทน$(command) `command`
andrybak

9

ใช้แบ็กสแลชเพื่อดำเนินการคำสั่งในบรรทัดถัดไป:

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! แค่เอาชนะฉัน: D
nerdwaller

@nerdwaller Heh ฉันคิดว่าคุณมีในครั้งแรก!
พอล

ฉันกลับไปอัปเดตเพื่อให้มีประโยชน์มากขึ้นและรับการเยื้อง ฉันรักซูแม้ว่าและโดยขนาดใหญ่
nerdwaller

มันใช้งานไม่ได้สำหรับฉันเช่น ในalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist

1
@TheDefinitionist ดูเหมือนปัญหาที่แตกต่างจากอันนี้ อาจเปิดคำถามใหม่?
Paul

5

คำสั่งเดียวกัน แต่มีความคิดเห็นสำหรับแต่ละบรรทัดจะเป็น:

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 \
    /
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.