शेल स्क्रिप्ट: अगर फाइल मौजूद नहीं है तो मैं फाइल में मल्टीलाइन कंटेंट कैसे लिख सकता हूं?


9

मुझे /opt/nginx/conf.d/default.confशेल स्क्रिप्ट के माध्यम से इस सामग्री के साथ फाइल बनाने की जरूरत है और अगर यह मौजूद नहीं है तो फाइल बनाएं:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /usr/share/nginx/html;
}

मैं शेल स्क्रिप्ट के माध्यम से मल्टीलाइन कंटेंट कैसे लिख सकता हूं?

मैंने डायरेक्टरी बनाई

sudo mkdir -p /opt/nginx/conf.d

लेकिन मुझे नहीं पता कि फाइल कैसे लिखनी है।


1
आप> (फ़ाइल को अधिलेखित करने के लिए) या >> (यदि यह पहले से मौजूद है तो संलग्न करने के लिए) का उपयोग कर सकते हैं। उदाहरण: गूंज "हैलो वर्ल्ड"> file.txt
रोब

यह है कि सभी स्थिर पाठ, या इसके किसी भी हिस्से को एक गतिशील मूल्य के साथ प्रतिस्थापित किया जाना चाहिए? (उदाहरण के लिए होस्ट नाम, बंदरगाह, रूट निर्देशिका, आदि)
जेफ स्कालर

मैंने स्पष्ट करने के लिए आपके प्रश्न को संपादित किया है, लेकिन मुझे गलतफहमी हो सकती है कि आप क्या चाहते थे। क्या आप फ़ाइल में सामग्री जोड़ना चाहते हैं भले ही वह पहले से मौजूद हो , या क्या आप केवल फ़ाइल बनाना चाहते हैं यदि वह मौजूद नहीं है? यदि फ़ाइल पहले से मौजूद है तो क्या होना चाहिए?
terdon

जवाबों:


13

सारांश: >>एपेंड करने के [ -f file ]लिए उपयोग करें, परीक्षण करने के लिए उपयोग करें।

प्रयत्न

if [ ! -f myfile ]
then
   cat <<EOF > myfile
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name $server ;
    root /usr/share/nginx/html;
}
EOF
fi
  • वाक्यविन्यास cat <<EOFको " यहाँ दस्तावेज़ " कहा जाता है ।
  • $server अपरिभाषित होने पर इसके मूल्य से प्रतिस्थापित किया जाएगा, या खाली किया जाएगा।
  • जैसा कि बताया गया है, 'EOF'यदि आप किसी भी जगह पर var से बचने के लिए एकल उद्धृत का उपयोग कर सकते हैं ।
  • आपके पास कई प्रतिध्वनि भी हो सकती हैं (यदि बहुत अधिक प्रतिध्वनि हो तो इसे बनाए रखने के लिए दर्द निवारक हो सकता है)

    echo "## foo.conf" > foo.conf
    echo param1=hello >> foo.conf
    echo param2=world >> foo.conf
    

prepending

बैश में कोई सीधा प्रीपेंड नहीं है, या तो अस्थायी फ़ाइल का उपयोग करें

mv file file_tmp
cat new_content file_tmp > file
rm file_tmp

या इसे संपादित करें

sed -i -e '1r new_file' -e 'wq' file

मैं किसी फ़ाइल में कुछ बहुस्तरीय सामग्री कैसे प्रस्तुत करूंगा?
user3142695

1
ऐसा करने के लिए एक और बुद्धिमान परिवर्तन यहाँ-डॉक्टर की सीमा को उद्धृत करना होगा, ताकि किसी भी शब्द $(यदि मौजूद हो) को चर के रूप में नहीं माना जाता है और इसलिए इसका विस्तार नहीं हो रहा है
Inian

@ user3142695 सबसे आसान होगा कि यहां-डॉक्यूमेंट को एक अलग फाइल में लिखा जाए और फिर catदोनों फाइलों को एक साथ रखा जाए और रिजल्ट को नया नाम दिया जाए।
Kusalananda

यदि कोई व्यक्ति कई अलग-अलग कार्य करना चाहता है echo, तो उसे ब्लॉक में रखकर केवल एक पुनर्निर्देशन करना और भी अधिक कुशल है: { echo "foo"; echo "bar"; echo "baz"; } >file- इस तरह हम fileहर बार जब हम सिर्फ एक पंक्ति लिखना चाहते हैं, तो हम इसे खोलना नहीं चाहते हैं, और उस लाइन को पूरा करने के बाद उसे बंद करना।
चार्ल्स डफी

यहाँ दस्तावेज़ का एक और अच्छा उपयोग:cat << EOF | sudo tee /opt/nginx/conf.d/default.conf ...
lp1051

3

यदि /opt/nginx/conf.d/default.conf फ़ाइल मौजूद नहीं है, तो फ़ाइल में स्थिर स्ट्रिंग मुद्रित करें (f):

[ -f /opt/nginx/conf.d/default.conf ] || printf 'server {\n    listen 80 default_server;\n    listen [::]:80 default_server;\n    server_name _;\n    root /usr/share/nginx/html;\n}\n' > /opt/nginx/conf.d/default.conf

1
मैं printf '%s\n' "first line" "second line"शायद थोड़ा अधिक पठनीय पर विचार करता हूं ; इस तरह से जहां भागने के लिए यह पता लगाने के लिए पूरे स्ट्रिंग के माध्यम से पढ़ने की जरूरत नहीं है ..
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.