2012-06-05 11 views
7

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

जब मैं कमांड (cat filename | grep -c '123456789') का उपयोग करता हूं, तो यह सही ढंग से गिनती प्रदर्शित करता है लेकिन जब मैं नीचे कमांड का उपयोग करता हूं तो यह कमांड नहीं मिलता है।

var =$(cat filename | grep -c '123456789') 
echo $var 

क्या आप मुझे बता सकते हैं कि मैं कहां गलत हूं?

+0

आप के आसपास एकल उद्धरण की जरूरत है अपने grep के लिए खोज स्ट्रिंग? – Levon

+0

@ लेवॉन, जीईपी के लिए रेगेक्स के आसपास एकल उद्धरण केवल तभी जरूरी होगा जब रेगेक्स में वर्ण हों, जिसे '$ 'या' ['या'] 'जैसे शैल द्वारा व्याख्या किया जाएगा। एक बहुत ही सरल रेगेक्स के रूप में कोई विशेष पात्र नहीं है, '123456789' को उद्धृत करने की आवश्यकता नहीं है। – ghoti

उत्तर

16

= संकेत के साथ स्पेस का उपयोग न करें:

var=$(cat filename | grep -c '123456789') 

पढ़ें कम से कम Bash Prog Intro Howto

लेकिन आप cat इसलिए कोड का एक बेकार उपयोग मिल गया है बस

var=$(grep -c '123456789' filename) 
0

बैकक्वॉट्स का उपयोग करना भी काम करेगा:

varx=`(cat filename| grep -c '123456789')` 

आईई, $ आवश्यक नहीं है, आप बैकक्वॉट्स के उपयोग के माध्यम से विभिन्न आदेशों के आउटपुट को आवंटित कर सकते हैं।

उदाहरण के लिए:

$ pwd 
/home/user99 

$ cur_dir=`pwd` 
$ echo $cur_dir 
/home/user99 
+1

यह काम करता है क्योंकि आपने '=' से पहले स्थान हटा दिया है; आप बैकक्वॉट्स –

+0

@ लेवॉन के बजाय '$ (' ... ')' नोटेशन (अधिक पठनीय, और * घोंसला *) रख सकते थे: क्या उपरोक्त आदेश में $ प्रतीक का उपयोग करना आवश्यक नहीं है? –

+0

@JackieJames आवश्यक नहीं है, आदेश दिखाए गए काम करता है, आप इसके बजाय बैकक्वॉट का उपयोग कर सकते हैं। मैंने दोनों को बैश और टीसीएस के साथ इस्तेमाल किया है। क्या आप इस कोशिश की समस्याओं में भाग गए? – Levon

6

कि ग्रेप याद रखें सीधे फ़ाइल पढ़ सकते हैं। आप useless use of cat से बच सकते हैं।

अपने प्रश्न में उदाहरण में, आदेश नहीं मिला त्रुटि अंतरिक्ष के कारण होती है इससे पहले कि बराबर चिह्न। csh/tcsh में

read var < <(grep -c '123456789' filename) 

या (पूर्णता के लिए): आप बैश उपयोग कर रहे हैं

var=$(grep -c '123456789' filename) 

या: बजाय इस प्रयास करें

setenv var `grep -c '123456789' filename` 
+0

+1 अच्छा बिंदु :) – Levon

+0

यह ठीक काम करता है क्योंकि मैं सीधे डेटा इनपुट कर रहा हूं। घोषित आगमन -एक आगमन = ($ (awk '/ 123456789/{प्रिंट एनआर}' फ़ाइल का नाम)) $ गूंज {आगमन [0]} $ {आगमन [*]} बीटी गूंज जब मैं करना नीचे के रूप में, यह काम नहीं करता है। क्या आप मुझे बता सकते हैं कि पैरामीटर 'नाम' का उपयोग नीचे कमांड का उपयोग कैसे किया जा सकता है: echo अपनी खोज स्ट्रिंग दर्ज करें: नाम पढ़ें घोषित करें- एआर arr = ($ (awk '/ "$ name"/{print एनआर} 'फ़ाइल नाम) echo $ {arr [0]} echo $ {arr [*]} –

+2

यह समझना मुश्किल है कि आप इस टिप्पणी के आधार पर क्या पूछ रहे हैं, संभवतः एसओ के स्वरूपण द्वारा बनाई गई गड़बड़ी के कारण। यदि आप अपने प्रश्न में अधिक जानकारी जोड़ने की आवश्यकता है, कृपया प्रश्न के तहत [संपादित करें] (http://stackoverflow.com/posts/10891817/edit) लिंक पर क्लिक करें, अपने परिवर्तन करें, और मैं तदनुसार अपना उत्तर अपडेट करूंगा। – ghoti

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