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


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.