नेस्टिंग के इंडेंट से मेल करने के लिए हेरेडोक इंडेंट नहीं कर सकते


62

यदि स्क्रिप्टिंग के लिए "प्रथम विश्व समस्याएं" हैं, तो यह यही होगा।

मेरे पास एक स्क्रिप्ट में निम्नलिखित कोड है जो मैं अपडेट कर रहा हूं:

if [ $diffLines -eq 1 ]; then
        dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g')

        mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI
        Last Change: $dateLastChanged

        This is an automated warning of stale data for the UNC-G Blackboard Snapshot process.
EOI

else
        echo "$diffLines have changed"
fi

स्क्रिप्ट मुद्दों के बिना ईमेल भेजती है, लेकिन अगर मैं दो विकल्पों के साथ छोड़ा जा रहा हूं तो mailx कमांड एक बयान में निहित है।

  1. EOIएक नई लाइन पर रखो और इंडेंटेशन पैटर्न को तोड़ो या
  2. इंडेंटेशन के साथ रखें लेकिन मेरे ईमेल को चूसने के लिए mailx प्राप्त करने के लिए एक इको स्टेटमेंट की तरह कुछ का उपयोग करें।

मैं विकल्प के लिए heredoc के लिए खुला हूँ, लेकिन अगर वहाँ एक तरह से इस के आसपास है यह मेरा पसंदीदा वाक्यविन्यास है।

जवाबों:


113

आप यहाँ-डॉक्टर ऑपरेटर को बदल सकते हैं <<-। तब आप यहाँ-डॉक्टर और परिसीमन दोनों को टैब के साथ इंडेंट कर सकते हैं:

#! /bin/bash
cat <<-EOF
    indented
    EOF
echo Done

ध्यान दें कि आपको टैब का उपयोग करना होगा , यहां-डॉक्टर को इंडेंट करने के लिए स्थान नहीं। इसका अर्थ है कि उपरोक्त उदाहरण कॉपी किए गए काम नहीं करेगा (स्टाॅक एक्सचेंज रीप्लेस टैब विद स्पेस)। पहले EOFसीमांकक के आसपास कोई उद्धरण नहीं हो सकता , अन्य पैरामीटर विस्तार, कमांड प्रतिस्थापन, और अंकगणितीय विस्तार प्रभावी नहीं हैं।


कूल, जो इंडेंट प्रॉब्लम को ठीक करता है, लेकिन अब वह वैरिएबल का विस्तार नहीं कर रहा है, जिसे मैं वहां डालने की कोशिश कर रहा हूं ( $dateLastChanged) अगर मैं आपके उदाहरण में हाइपेन + कोट्स करता हूं, लेकिन अगर मैं हाइफ़न लेता हूं और उद्धरण देता हूं और ईओआई डालता हूं नई लाइन इसे फिर से विस्तारित करना शुरू कर देती है।
ब्राचली

1
@JoelDavis: बस उद्धरण हटाएं, हाइफ़न रखें।
चोरोबा

5
टैब का उपयोग करने के लिए मजबूर होना बहुत कष्टप्रद है। क्या इसके आसपास एक अच्छा तरीका है?
con-f-use

2
@ कोन-एफ-यूज़: आप कुछ इस तरह की कोशिश कर सकते हैं cat << EOF | sed 's/^ *//'
चोराबा

4
या इससे भी बेहतर cat <<- EOF | awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {print substr($0, n+1)}':। यह यहां दस्तावेज़ में हर पंक्ति से पहली पंक्ति में रिक्त स्थान पूर्ववर्ती (करने के लिए धन्यवाद की राशि को हटा anubhava )।
con-f-use

5

यदि आपको अपने यहां-दस्तावेज़ के अंदर कमांड प्रतिस्थापन और पैरामीटर विस्तार की आवश्यकता नहीं है, तो आप प्रमुख स्थानों को परिसीमन में जोड़कर टैब का उपयोग करने से बच सकते हैं:

$     cat << '    EOF'
>         indented
>     EOF
        indented
$     cat << '    EOF' | sed -r 's/^ {8}//'
>         unindented
>     EOF
unindented

मैं इस चाल का उपयोग करने और पैरामीटर विस्तार रखने का एक तरीका नहीं समझ सका, हालाँकि।


1
मेरे लिए, यह एकमात्र उत्तर है जो रिक्त स्थान का उपयोग किए बिना इंडेंटिंग समस्या को हल करता है। shell-checkकोई भी इंडेंट परिवर्तन पाएंगे जो उद्धृत स्ट्रिंग में रिक्त स्थान से मेल नहीं खाते। पैरामीटर विस्तार के लिए दोहरे उद्धरण चिह्नों का उपयोग करें?
टॉम हेल

4

इसे इस्तेमाल करे:

sed 's/^ *//' >> ~/Desktop/text.txt << EOF
    Load time-out reached and nothing to resume.
    $(date +%T) - Transmission-daemon exiting.
EOF

आपके पास अलग-अलग-संकेत वाली लाइनें नहीं हो सकती हैं, यह मामला है। (यह मायने रखता है यदि उदाहरण के लिए सामग्री एक स्क्रिप्ट है।)
ivan_pozdeev

2

हम्म ... लगता है कि आप --formatतर्क का बेहतर लाभ यहां ले सकते हैं --printfबजाय उपयोग करने के लिए और बस एक पाइप के ऊपर से गुजरें। इसके अलावा, आपका if...fiएक कंपाउंड कमांड है - यह एक रीडायरेक्ट ले सकता है जिसमें सभी समाहित कमांड इनहेरिट करेंगे, इसलिए हो सकता है कि आपको हेरेडोक को घोंसले में डालने की आवश्यकता न हो।

if      [ "$diffLines" = 1 ]
then    stat --printf "Last Change: %.19y\n\n$(cat)\n" /.bbdata |
        mailx   -r  "Systems and Operations <sysadmin@[redacted].edu>" \
                -s  "Warning Stale BB Data" 'jadavis6@[redacted].edu'
else    echo    "$diffLines have changed"
fi      <<\STALE
This is an automated warning of stale data for the UNC-G Blackboard Snapshot process.
STALE

हाँ मेरे पिछले संशोधन ने कहा कि मुझे sed/ awkभाग को बुरा नहीं लगा । आज मेरे संशोधन का एक हिस्सा इसे बाहर ले जाना था क्योंकि यह सवाल करने के लिए जर्मन नहीं था। किसी भी तरह से यह दूसरे के आधा दर्जन में से छह है।
ब्राचली

@ ब्रेचली - लानत है। यह आखिरी वाक्य मुझे शेष दिन के लिए विचलित करने वाला है।
मिकसेर

आपका क्या मतलब है?
ब्राचली

1
@ ब्रेटली - एक पहेली की तरह लग रहा है।
15

हा। यकीन नहीं होता कि आप किस देश से हैं, लेकिन यह राज्यों में एक आम वाक्यांश है। बस का अर्थ है "एक ही छोर पर अलग दृष्टिकोण।" आपका समाधान हालांकि हेरेडोक के आसपास मिलता है।
ब्राचली

0

दूसरी विधि हेरस्ट्रेस होगी:

    mail_content="Last Change: $dateLastChanged

    This is an automated warning of stale data for the UNC-G Blackboard Snapshot process."
    mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<<"$mail_content"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.