2012-01-23 13 views
11

मैं बैश और पर्ल के संयोजन के साथ कुछ स्क्रिप्ट को संशोधित करने की कोशिश कर रहा हूं।मैं अपने बैश लूप वैरिएबल को पर्ल दुभाषिया में कैसे पास कर सकता हूं?

for index in {1..25}; do 
    perl -pi -e 's/\d+/$index/' cmd_$index.sh; 
done 

वहाँ $index पर्ल एक लाइनर के भीतर अपनी बैश लबादा पहन बनाने के लिए एक रास्ता है: मुसीबत पर्ल का मानना ​​है कि कि $index अपनी ही चर, जो परिभाषित नहीं किया जाता है?

+0

'$ index_' पर्ल और बैश दोनों में एक वैध प्रतीक नाम है। शायद आप 's ///' ऑपरेटर के लिए एक अलग डिलीमीटर का उपयोग करना चाहते हैं? – mob

+0

@mob: हाँ, मैं इसे बदलने जा रहा था ... प्रक्रिया में इसे और अधिक पठनीय और खराब चीजों को बनाने की कोशिश कर रहा था: | – Zaid

+0

@mob: Regex delimiters – Zaid

उत्तर

19

do लूप में export index; निचोड़ें। पर्ल कार्यक्रम के शरीर में $ENV{index} का संदर्भ लें।

वैकल्पिक रूप से: डबल कोट्स "… $index … " का उपयोग करें जो कि चर चरम को अभिव्यक्ति में विभाजित करने के लिए है जो पर्ल प्रोग्राम का शरीर बनाता है। यदि आप इस एक-लाइनर का विस्तार करना चाहते हैं, तो पर्ल अभिव्यक्तियों जैसे $ पर वेरिएबल नामों से ठीक से बचने के लिए सावधानी बरतें, और शायद बैकस्लेश, ताकि पर्ल द्वारा व्याख्या की जा सके, शैल नहीं।

+0

बदल गया है यह सबसे अच्छा है, _provided_ 'अनुक्रमणिका' को बैश से निर्यात किया गया है। आप इसे लूप से पहले या उसके दौरान कर सकते हैं। –

+0

TIMTOWTDI – Zaid

7

' के बजाय " का उपयोग करें। पर्ल इसे देखने से पहले बैश वैरिएबल को प्रतिस्थापित कर सकता है।

2

सिंगल कोट्स के बजाय डबल कोट्स का उपयोग करें और $ स्ट्रिंग को पार करने से पहले $ इंडेक्स इंटरपोलेट किया जाएगा।

2

यहाँ एक काम कर उदाहरण दिया गया है (हालांकि आपकी समस्या के संदर्भ में नहीं - खेद है!):

generatep() { 
    perl -e ' 
     $_stem=$ARGV[0]; 
     $_ctx=$ARGV[1]; 
     $_role=$ARGV[2]; 
     $i=$ARGV[3]; 
     $ct=$i + $ARGV[4]; 
     while ($i < $ct) { 
      print "user=$_stem$i,$_ctx,$_role\n"; 
      $i++; 
     } 
    ' ${stem} ${ctx} ${role} ${startix} ${count} 
} 
+0

के लिए धन्यवाद क्या यह पर्ल की '-पीआई' हैंडलिंग में हस्तक्षेप करने की संभावना नहीं है? –

+0

यह मेरे लिए अच्छा काम करता है! आपको वैरिएबल को निर्यात करने की आवश्यकता नहीं है। यह आपकी स्क्रिप्ट के अंदर स्थानीय रूप से घोषित वर्रों के साथ काम करता है। – wmorrison365

+0

यानी perl को vars पास करने का यह तरीका "-पीआई" को प्रभावित नहीं करता है। ठीक काम करता है। इस में एक लूप का मेरा उपयोग उदा। "-पीआई" को प्रभावित कर सकता है, लेकिन, यह सिर्फ एक उदाहरण है – wmorrison365

1

मैं इस समस्या यहाँ लगता है कि पार्टी खोल globs पर्वतमाला का समर्थन नहीं करते है। किसी कारण से, मैंने सोचा कि उन्होंने किया था। कोई फर्क नहीं पड़ता, perl श्रेणियों का समर्थन करता है ठीक है:

perl -pi -e ' 
    BEGIN { @ARGV = map "cmd_$_.sh", 1 .. 25; } 
    my ($index) = $ARGV =~ /(\d+)/; 
    s/\d+/$index/' 

थोड़ा सा बेकार, लेकिन यह वैसे भी एक भाषा है।

+0

क्या आप जानते थे कि 'BEGIN' ब्लॉक एस्किमो चुंबन के बीच में wedged सकता है :)? : '$ perl -e '...} BEGIN {...'' – Zaid

+0

@ ज़ेड हो सकता है, लेकिन यह टाइपिंग के एक घुंघराले ब्रैकेट को बचाने के लिए बहुत सारे तर्क का त्याग कर रहा है। = पी – TLP

+0

+1, कार्य पर अच्छा जूडो – daxim

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

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