2010-04-17 9 views
63

या तो मुझे कुछ बैकलैश या बैकलैशिंग याद आती है जो बहुत अधिक प्रोग्रामर-कोट-लूपिंग के साथ काम नहीं कर रहा है।बैश बैकटिक्स को ठीक से घोंसला कैसे करें

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``" 

hello1-hello2-hello3-echo hello4 

वांटेड

hello1-hello2-hello3-hello4-hello5-hello6-... 
+0

प्रश्न शायद "बैश बैकिक्स का पुनरावृत्ति का उपयोग कैसे करें" पढ़ना चाहिए। इससे गुगलर्स को वहां मदद करनी चाहिए। –

+0

क्या आप यह करने की कोशिश कर रहे हैं। इसका कोई अर्थ नहीं है। – ghostdog74

+1

@joey, शीर्षक बदल गया, मेरा स्वागत है: डी – Stormenet

उत्तर

103

उपयोग $(commands) बजाय:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 

$(commands) बैकटिक्स के समान ही काम करता है, लेकिन आप उन्हें घोंसला कर सकते हैं।

तुम भी बैश सीमा विस्तार में रुचि हो सकती:

echo hello{1..10} 
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10 
+0

+1 {1..10} की तरह +1। सरणी के साथ इसे सीमित करें? जेडएसएच "$ {$ (दिनांक) [2,4]}" कर सकता है। क्यों नहीं: "echo $ {echo hello1 - $ (echo hello2) [1]}"? – hhh

7

अगर आप पार्टी के $(cmd)command substitution syntax है, जो बहुत अधिक नेस्ट किया जा रहा करने के लिए अनुकूल है का उपयोग बहुत आसान है:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))" 
hello1-hello2-hello3-hello4 
+4

यह * bash * तक सीमित नहीं है। यह सभी गोले में उपलब्ध है जो POSIX 1003.1 ("POSIX शैल") और अधिकांश बोर्न-व्युत्पन्न खोल (* ksh *, * राख *, * डैश *, * bash *, * zsh *, आदि) के अनुरूप हैं, हालांकि नहीं वास्तविक बोर्न खोल (यानी http://heirloom.sourceforge.net/sh.html)। –

22

आप बैकटिक उपयोग करने के लिए जोर देते हैं, तो

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``" 

निम्नलिखित किया जा सकता है आप, बैकस्लैश डाल करने के लिए है \\ \\\\ \\\\\\\\ 2x द्वारा और इतने पर, यह बहुत बदसूरत है, अन्य सुझावों के रूप में $(commands) का उपयोग करें।

+0

यह वास्तव में सवाल का जवाब देता है – Justas

8

किसी भी समय आप एक आदेश उपयोग command substitution का मूल्यांकन करना चाहते:

$(command) 

किसी भी समय आप अंकगणितीय अभिव्यक्ति उपयोग expression substitution का मूल्यांकन करना चाहते:

$((expr)) 

आप कर सकते हैं घोंसला इस तरह इन:

मान लें कि file1.txt 30 लाइन लंबी है और file2.txt 10 लाइन लंबी है, आप इस तरह की अभिव्यक्ति का मूल्यांकन कर सकते हैं:

$(($(wc -l file1.txt) - $(wc -l file2.txt))) 

जो आउटपुट 20 (दो फाइलों के बीच लाइनों की संख्या में अंतर) होगा।

संबंधित मुद्दे