लिनक्स बैश स्क्रिप्ट, सिंगल कमांड लेकिन मल्टीपल लाइन्स?


97

मेरे पास Google को खोजकर लिखी गई निम्न स्क्रिप्ट है, और यह मेरे लिनक्स सिस्टम को एक संग्रह में वापस लाती है:

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

इस तरह यह बाद में पढ़ने और संपादित करने में आसान है। क्या इस तरह से बैश स्क्रिप्ट को फॉर्मेट करना संभव है?

जवाबों:


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
टिक्कियों

कभी भी @JayLaCroix - एसयू में आपका स्वागत है!
nerdwaller

1
इसके बजाय इसका उपयोग करने की सिफारिश की जाती है । $(command)`command`
और्रीबक

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! बस मुझे हरा: डी
nerdwaller

@nerdwaller हे, मुझे लगा कि आपका पहला मिल गया है!
पॉल

मैं इसे और अधिक उपयोगी बनाने और इंडेंटेशन प्राप्त करने के लिए इसे अपडेट करने के लिए वापस चला गया। मुझे एसयू से प्यार है, हालांकि, और बड़े।
nerdwaller

यह मेरे लिए काम नहीं करता है जैसे कि। मेंalias ub='source ~/.bash_aliases \ && source $HOME/.bash_aliases \ && echo "aliases updated."';
TheDefinitionist

1
@Definitionist यह एक अलग समस्या की तरह लगता है। शायद कोई नया सवाल खोलूं?
पॉल

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 \
    /
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.