2011-09-06 14 views
109

आप बैश निरंतरता लाइनों का उपयोग कैसे करते हैं?बैश निरंतरता लाइन

मुझे पता है आप यह कर सकते हैं कि:

echo "continuation \ 
lines" 
>continuation lines 

हालांकि, अगर आप कोड इंडेंट है, यह इतनी अच्छी तरह से काम नहीं करता:

echo "continuation \ 
    lines" 
>continuation  lines 
+4

Google की बैश शैल स्टाइल गाइड ["यहां" दस्तावेज़ों की सिफारिश करता है] (https://google.github.io/styleguide/shell।xml # Line_Length_and_Long_Strings) "यदि आपको स्ट्रिंग्स लिखना है जो 80 वर्णों से अधिक हैं"। [@ ट्रिपली का उत्तर] देखें (http://stackoverflow.com/questions/7316107/bash-continuation-lines/7316685#7316685)। –

उत्तर

113

यह है कि तुम क्या चाहते हो सकता है

है
$  echo "continuation"\ 
>  "lines" 
continuation lines 

यदि यह गूंजने के लिए दो तर्क बनाता है और आप केवल एक चाहते हैं, तो चलिए स्ट्रिंग कॉन्सटेनेशन देखें। बैश में, एक दूसरे को CONCATENATE अगले दो तार रखने:

$ echo "continuation"\ 
> "lines" 
continuationlines 

लेकिन जब एक मांगपत्र प्रयोग किया जाता है:

$ echo "continuation""lines" 
continuationlines 

तो एक निरंतरता लाइन एक मांगपत्र बिना एक तरह से एक स्ट्रिंग को तोड़ने के लिए है :

$  echo "continuation"\ 
>  "lines" 
continuation lines 

आपको दो तर्क मिलते हैं क्योंकि यह अब एक समझौता नहीं है।

आप एक ही स्ट्रिंग जो, लाइनों को पार करते हुए इंडेंट लेकिन उन सभी रिक्त स्थान नहीं मिल रहा है चाहते हैं, तो एक दृष्टिकोण तुम कोशिश कर सकते निरंतरता लाइन और उपयोग चर खाई करने के लिए है:

$ a="continuation" 
$ b="lines" 
$ echo $a$b 
continuationlines 

यह आपको अनुमति देगा अतिरिक्त चर के खर्च पर स्पष्ट रूप से इंडेंट कोड होना है। यदि आप चर को स्थानीय बनाते हैं तो यह बहुत खराब नहीं होना चाहिए।

+0

आपकी मदद के लिए धन्यवाद, लेकिन जब यह रिक्त स्थान को हटा देता है, तो वे अब अलग-अलग पैरामीटर हैं (बैश पैरामीटर विभाजक के रूप में दूसरी पंक्ति पर रिक्त स्थान की व्याख्या कर रहा है) और अब इको कमांड के कारण ही सही तरीके से मुद्रित हैं। –

+1

ओह, आप लाइनों के विस्तार के लिए एक सिंगल (बाश) स्ट्रिंग चाहते हैं! मुझे अब दिख गया। –

+3

एक चर के साथ समाधान: 's =" स्ट्रिंग संख्या 1 " एस + =" स्ट्रिंग संख्या 2 " एस + =" स्ट्रिंग संख्या 3 " गूंज" $ s "' –

25

यहां <<-HERE टर्मिनर के साथ दस्तावेज़ इंडेंट मल्टी-लाइन टेक्स्ट स्ट्रिंग्स के लिए अच्छी तरह से काम करते हैं। यह यहां दस्तावेज़ से किसी भी प्रमुख टैब को हटा देगा।

cat <<-____HERE 
    continuation 
    lines 
____HERE 

भी देखें http://ss64.com/bash/syntax-here.html

आप कुछ को संरक्षित करने की जरूरत है, लेकिन सभी, अग्रणी खाली स्थान के, आप कुछ llke

sed 's/^ //' <<____HERE 
    This has four leading spaces. 
    Two of them will be removed by sed. 
____HERE 
-1

इस का उपयोग कर सकते नहीं शायद वास्तव में अपने प्रश्न का उत्तर नहीं है लेकिन आप इसे वैसे भी उपयोगी पा सकते हैं।

पहला आदेश दूसरी कमांड द्वारा प्रदर्शित स्क्रिप्ट बनाता है।

तीसरा आदेश उस स्क्रिप्ट को निष्पादन योग्य बनाता है।

चौथा आदेश एक उपयोग उदाहरण प्रदान करता है।

[email protected]:~/tmp/so$ echo $'#!/usr/bin/env python\nimport textwrap, sys\n\ndef bash_dedent(text):\n """Dedent all but the first line in the passed `text`."""\n try:\n  first, rest = text.split("\\n", 1)\n  return "\\n".join([first, textwrap.dedent(rest)])\n except ValueError:\n  return text # single-line string\n\nprint bash_dedent(sys.argv[1])' > bash_dedent 
[email protected]:~/tmp/so$ cat bash_dedent 
#!/usr/bin/env python 
import textwrap, sys 

def bash_dedent(text): 
    """Dedent all but the first line in the passed `text`.""" 
    try: 
     first, rest = text.split("\n", 1) 
     return "\n".join([first, textwrap.dedent(rest)]) 
    except ValueError: 
     return text # single-line string 

print bash_dedent(sys.argv[1]) 
[email protected]:~/tmp/so$ chmod a+x bash_dedent 
[email protected]:~/tmp/so$ echo "$(./bash_dedent "first line 
>  second line 
>  third line")" 
first line 
second line 
third line 

ध्यान दें कि आप वास्तव में इस स्क्रिप्ट का उपयोग करना चाहते हैं, इसे और अधिक समझ में आता है ताकि यह आपके रास्ते में हो जाएगा ~/bin में निष्पादन स्क्रिप्ट स्थानांतरित करने के लिए।

textwrap.dedent काम करता है के विवरण के लिए पायथन संदर्भ देखें।

यदि $'...' या "$(...)" का उपयोग आप को भ्रमित कर रहा है, तो एक और प्रश्न पूछें (एक प्रति निर्माण) यदि पहले से कोई नहीं है। आपके द्वारा प्राप्त/पूछे जाने वाले प्रश्न का लिंक प्रदान करना अच्छा हो सकता है ताकि अन्य लोगों के पास एक लिंक किया गया संदर्भ हो।

+5

अच्छी तरह से इरादा- और संभवतः यहां तक ​​कि उपयोगी- हालांकि यह हो सकता है, ओपी ने मूल बैश वाक्यविन्यास पर सलाह मांगी, और आपने उसे एक पायथन फ़ंक्शन परिभाषा दी जो ओओ प्रतिमानों, असाधारण प्रवाह नियंत्रण और आयात का उपयोग करता है। इसके अलावा, आप एक स्ट्रिंग इंटरपोलेशन के हिस्से के रूप में निष्पादन योग्य कहलाते हैं- ऐसा कुछ जो इस प्रकार के प्रश्न पूछने वाला व्यक्ति निश्चित रूप से बाश में नहीं देखा होगा। –

2

मैं ऐसी परिस्थिति में आया जिसमें मुझे कमांड तर्क के हिस्से के रूप में एक लंबा संदेश भेजना पड़ा और लाइन की लंबाई सीमा का पालन करना पड़ा।

somecommand --message="I am a long message" args 

तरह से मैं इस हल यहां दस्तावेज़ के रूप में संदेश बाहर ले जाने के लिए (@tripleee तरह का सुझाव दिया है) है: आदेशों कुछ इस तरह लग रहा है। लेकिन यहां दस्तावेज़ तो यह में वापस पढ़ें जाने की आवश्यकता है, एक stdin हो जाता है, मैं नीचे दृष्टिकोण के साथ चला गया:

message=$(
    tr "\n" " " <<- END 
     This is a 
     long message 
END 
) 
somecommand --message="$message" args 

यह लाभ यह है कि $message कोई अतिरिक्त व्हाइट के साथ लगातार स्ट्रिंग के रूप में वास्तव में इस्तेमाल किया जा सकता है या नहीं है कतार टूट जाती है।

ध्यान दें कि उपरोक्त वास्तविक संदेश पंक्तियों को tab वर्ण प्रत्येक के साथ प्रीफ़िक्स किया गया है, जो यहां दस्तावेज़ द्वारा छीन लिया गया है (<<- के उपयोग के कारण)। अंत में लाइन ब्रेक अभी भी हैं, जिन्हें रिक्त स्थान के साथ dd द्वारा प्रतिस्थापित किया गया है।

ध्यान दें कि यदि आप न्यूलाइन नहीं हटाते हैं, तो वे तब दिखाई देंगे जब "$message" का विस्तार किया जाएगा। कुछ मामलों में, आप $message के आसपास डबल-कोट्स को हटाकर कामकाज करने में सक्षम हो सकते हैं, लेकिन संदेश अब एक भी तर्क नहीं होगा।

-1

However, if you have indented code, it doesn't work out so well:

echo "continuation \ 
    lines" 
>continuation  lines 

तार श्रृंखलाबद्ध एकल उद्धरण के साथ की कोशिश करो और:

echo 'continuation' \ 
    'lines' 
>continuation lines 

नोट: संयोजन एक खाली स्थान के भी शामिल है।

+1

यह गूंज और स्ट्रिंग तर्क के साथ काम करता है, लेकिन यह वैरिएबल असाइनमेंट जैसे अन्य चीजों के साथ काम नहीं करता है। हालांकि सवाल चर के बारे में नहीं था, इको का उपयोग केवल एक उदाहरण था। यदि आपके पास 'x =' था, तो 'echo' के बजाय, आपको त्रुटि मिल जाएगी: 'पंक्तियां: कमांड नहीं मिला'। –

2

आप bash arrays

$ str_array=("continuation" 
      "lines") 
तो

$ echo "${str_array[*]}" 
continuation lines 

उपयोग कर सकते हैं क्योंकि (बैश मैनुअल के बाद) एक अतिरिक्त जगह नहीं है,:

If the word is double-quoted, ${name[*]} expands to a single word with the value of each array member separated by the first character of the IFS variable

तो IFS='' सेट से छुटकारा पाने के अतिरिक्त स्थान

$ IFS='' 
$ echo "${str_array[*]}" 
continuationlines 
0

आप इसे इंडेंटेशन के भीतर आवश्यकतानुसार केवल नई लाइनों (बैकस्लैश का उपयोग किए बिना) के साथ अलग कर सकते हैं और केवल नई लाइनों को पट्टी कर सकते हैं।

उदाहरण:

echo "continuation 
of 
lines" | tr '\n' ' ' 

या अगर यह एक चर परिभाषा नई-पंक्तियों स्वचालित रूप से रिक्त स्थान में परिवर्तित हो जाता। तो, लागू होने पर अतिरिक्त रिक्त स्थान की पट्टी।

x="continuation 
of multiple 
lines" 
y="red|blue| 
green|yellow" 

echo $x # This will do as the converted space actually is meaningful 
echo $y | tr -d ' ' # Stripping of space may be preferable in this case 
संबंधित मुद्दे