कैसे बैश बैकस्ट को ठीक से घोंसला करें


91

या तो मैंने कुछ बैकलैश मिस किया या बैकलैशिंग बहुत प्रोग्रामर-कोट-लूपिंग के साथ काम नहीं करता है।

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

hello1-hello2-hello3-echo hello4

चाहता था

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

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

ऐसा क्या है जो आप करने की कोशिश कर रहे हैं। इसका कोई अर्थ नहीं है।
घोस्टडॉग ghost४

1
@joey, शीर्षक बदल गया, ure का स्वागत: D
स्ट्रोमेनेट

1
उफ़, खरोंच कि। इसे पढ़ना चाहिए "मैं बैश में बैकस्टिक्स कैसे कर सकता हूं?" । मुझे पुनरावृत्ति मिली और घोंसला बनाने का काम मिला।
जॉय एडम्स

बैकटिक्स हैं deprecated, इसलिए उपयोग करें $(cmd)
तिमो

जवाबों:


144

$(commands)इसके बजाय उपयोग करें :

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

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

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

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

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

35

यदि आप backticks का उपयोग करने के लिए जोर देते हैं, तो निम्नलिखित किया जा सकता है

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

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


11

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

$(command)

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

$((expr))

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

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

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

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


10

यदि आप bash के $(cmd) कमांड प्रतिस्थापन सिंटैक्स का उपयोग करते हैं, तो यह बहुत आसान है , जो नेस्टेड होने के लिए बहुत अधिक अनुकूल है:

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

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

वाह, इस उत्तर पर टाइमस्टैम्प @joey_adams उत्तर पर उस पर निर्भर है! इसमें समकालिकता सबसे शाब्दिक अर्थ है :) यहाँ भी
उत्कर्ष

0

कभी-कभी बैकटिक नेस्टिंग को xargsपाइप और पाइप के साथ प्रतिस्थापित किया जा सकता है

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

इस समाधान की कमियां हैं:

  • सभी तर्क रिवर्स ऑर्डर में प्रदान किए जाने चाहिए (4 → 1);
  • सभी तर्क अलग हो जाते हैं (साथ हल tr):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4


चलो एक वास्तविक उपयोग-मामला दिखाते हैं।

निम्नलिखित आदेश बाश में काम करते हैं, लेकिन tsh में नहीं (backtick नेस्टिंग tcsh में बहुत अच्छे से नहीं संभाला जाता है)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

उन्हें इसके साथ प्रतिस्थापित किया जा सकता है

$ which bash | xargs dirname | xargs ls
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.