নেস্টিংয়ের ইনডেন্টের সাথে ম্যাচ করতে হেরেডোক ইনডেন্ট করতে পারবেন না


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

স্ক্রিপ্টটি ইস্যু ছাড়াই ইমেল প্রেরণ করে তবে মেইলএক্স কমান্ডটি যদি একটি বিবৃতিতে বাসা বেঁধে থাকে তবে আমি দুটি পছন্দ রেখে যাব বলে মনে হচ্ছে:

  1. রাখুন EOIনতুন লাইন এবং খাঁজ নিদর্শন ভঙ্গ বা
  2. ইন্ডেন্টেশন সহ রাখুন তবে আমার ইমেল চুষতে মেইলএক্স পেতে ইকো স্টেটমেন্টের মতো কিছু ব্যবহার করুন।

আমি বংশগত বিকল্পের জন্য উন্মুক্ত, কিন্তু যদি এটির কাছাকাছি যাওয়ার কোনও উপায় থাকে তবে এটি আমার পছন্দসই সিনট্যাক্স।

উত্তর:


113

আপনি এখানে-ডক অপারেটরে পরিবর্তন করতে পারেন <<-। তারপরে আপনি এখানে-ডক এবং ডিলিমিটার উভয়ই ট্যাব সহ ইনডেন্ট করতে পারেন :

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

মনে রাখবেন যে এখানে-ডকটিতে ইন্ডেন্ট করার জন্য আপনার অবশ্যই ট্যাব ব্যবহার করা উচিত । এর অর্থ উপরের উদাহরণটি অনুলিপি করে কাজ করবে না (স্ট্যাক এক্সচেঞ্জ স্পেসগুলির সাথে ট্যাবগুলি প্রতিস্থাপন করে)। প্রথম EOFডিলিমিটারের আশেপাশে কোনও উদ্ধৃতি দেওয়া যাবে না , অন্যথায় প্যারামিটার সম্প্রসারণ, কমান্ড প্রতিস্থাপন, এবং গাণিতিক সম্প্রসারণ কার্যকর হয় না।


শীতল, এটি ইনডেন্ট সমস্যার সমাধান করে তবে এখন আমি সেই পরিবর্তনশীলটি প্রসারিত করছি না যেখানে $dateLastChangedআমি সেখানে রাখার চেষ্টা করছি ( ) যদি আমি আপনার উদাহরণে হাইপেন + কোটস জিনিসটি করি তবে যদি আমি হাইফেন এবং উদ্ধৃতিগুলি বের করি এবং একটি EOI রাখি নতুন লাইন এটি আবার প্রসারণ শুরু করে।
ব্র্যাচলে

1
@ জোয়েলডাভিস: কেবল উদ্ধৃতিগুলি সরিয়ে ফেলুন, হাইফেন রাখুন।
চোরোবা

5
ট্যাবগুলি ব্যবহার করতে বাধ্য করা খুব বিরক্তিকর। এর চারপাশে কি কোনও ভাল উপায় আছে?
কনফ-এ-ব্যবহার

2
@ কন-এফ-ব্যবহার: আপনি এর মতো আরও কিছু চেষ্টা করতে পারেন cat << EOF | sed 's/^ *//'
চোরোবা

4
নাকি ভালো: cat <<- EOF | awk 'NR==1 && match($0, /^ +/){n=RLENGTH} {print substr($0, n+1)}'। এটি এখানে নথির প্রতিটি লাইন থেকে প্রথম লাইনে পূর্ববর্তী স্থানগুলির পরিমাণ সরিয়ে দেয় ( অনুভাকে ধন্যবাদ )।
কন-এফ-ব্যবহার

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

হেরডোকের মধ্যে আপনার আলাদা আলাদা-ইন্ডেন্টেড লাইন থাকতে পারে না এই ক্ষেত্রে। (যদি বিষয়গুলি উদাহরণস্বরূপ লিপি হয় তবে এটি গুরুত্বপূর্ণ
matters

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অংশটিকে কিছু মনে করি না । আমার আজকের পুনর্বিবেচনার অংশটি হ'ল যেহেতু এটি প্রশ্নের উত্তর জার্মানি নয় german যে কোনও উপায়ে এটি অন্য অর্ধ ডজনের মধ্যে ছয়।
ব্র্যাচলে 27'15

@ ব্র্যাচলে - জঘন্য। সেই শেষ বাক্যটি আমাকে দিনের বাকী অংশে বিভ্রান্ত করতে চলেছে।
মাইকজার্ভ

আপনি কী বলতে চাইছেন?
ব্র্যাচলে

1
@ ব্র্যাচলে - একটি ধাঁধা মত দেখাচ্ছে।
মাইকজার্ভ

হা। আপনি কোন দেশ থেকে এসেছেন তা নিশ্চিত নন তবে এটি যুক্তরাষ্ট্রের একটি সাধারণ বাক্য। কেবলমাত্র "একই প্রান্তে ভিন্ন পদ্ধতির" অর্থ। যদিও আপনার সমাধানটি হেরডোকের কাছাকাছি চলেছে।
ব্র্যাচলে

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"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.