क्या मैं बैश ब्रेस विस्तार में एक चर का उपयोग कर सकता हूं?


10

नीचे कुछ छद्म कोड दिए गए हैं जिन्हें मैं पूरा करने की कोशिश कर रहा हूं:

#!/bin/bash

# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])

# This is basically what I want to do with it:
for i in {1..$numlines}; do
    # the part below is already figured out as well:        
    do some other stuff
done

मैं '{1..n}' अनुक्रम में वास्तविक संख्या डालकर कमांड लाइन से इसे ठीक से निष्पादित कर सकता हूं। मुझे सिर्फ यह जानना है कि क्या यहां एक चर को शामिल करना संभव है और इसे कैसे करना है।

  • मैंने exportइसे निगलना चाहा है
  • मैं अनुक्रम के अंदर घुंघराले ब्रेसिज़ में ही चर डालने की कोशिश की है: {1..${numlines}}
  • मैंने इसे दोहरे-उद्धरणों में डालने की कोशिश की है, उम्मीद है कि इसका विस्तार होगा: {1.."$numlines"}
  • मैंने भागने की कोशिश की है $:{1..\$numlines}

क्या set -[something]इस चर का विस्तार करने के लिए मुझे एक आदेश का उपयोग करने की आवश्यकता है ? मैं भी उपयोग करने के कुछ रूपों की कोशिश की है eval... कोई फायदा नहीं हुआ।

मुझे बस यह जानने की जरूरत है कि क्या कुछ सरल या अस्पष्ट है जो मुझे याद आ रहा है या यदि इससे पहले कि मैं उस पर समय बर्बाद करता हूं, तो यह संभव है।

मैं इसे एक साथ फेंक सकता हूं, वास्तव में हैक करने का तरीका यह है कि इसे आवश्यकतानुसार काम करने के लिए, लेकिन मैं इससे बचना चाहूंगा कि यदि संभव हो तो और इसे करने के बारे में जाने का सही तरीका सीखें।


जवाबों:


11

दुर्भाग्य से, उस विस्तार (AFAIK) में एक चर का उपयोग करने का कोई तरीका नहीं है, क्योंकि चर विस्तार ब्रेस विस्तार के बाद होता है।

सौभाग्य से, एक उपकरण है जो एक ही काम करता है।

for i in $(seq 1 $numlines); do
    # stuff
done

seqग्नू कोरुटिल्स से है; यह कैसे करें में कोई विचार नहीं है।


1
(प्लस /)। seqजीएनयू सिस्टम के लिए अच्छा है और, अगर मैं सही ढंग से याद करूं, तो सबसे हालिया OSX। अन्य बीएसडी प्रणालियों पर, व्यक्ति इसके बजाय जोट का उपयोग कर सकता है ।
जॉन 1024

seqअच्छी तरह से काम। आपके शीघ्र उत्तर के लिए बहुत बहुत धन्यवाद।
rubynorails

यह मेरे सवाल का हिस्सा नहीं था - लेकिन रिवर्स ऑर्डर में ऐसा करने के लिए वाक्यविन्यास (यदि कोई हो) क्या है, जैसे कि {16..1}? $(seq $numlines 1)काम नहीं किया। मुझे लगता है कि मैं हमेशा कर सकता हूं man seq, लेकिन अगर किसी को उनके सिर के ऊपर से पता था तो बस सोच रहा था।
rubynorails

1
बस यह पता लगाना है कि इस लिंक से इसे कैसे करना है -for i in $(seq $numlines -1 1)
rubynorails

seq ${numlines} -1 0
डोपघोटी

10

ज़रूर। यदि आप एक लूप के लिए चाहते हैं जो एक पूर्णांक चर को बढ़ाता है, तो उस forलूप के रूप का उपयोग करें जो एक पूर्णांक चर को बढ़ाता है (या आमतौर पर लूप चर (ओं) पर अंकगणित करता है)।

for ((i=1; i<=numlines; i++)); do  done

यह निर्माण बाश (और ksh93 और zsh) में काम करता है, लेकिन सादे श में नहीं। सादे श में, थोड़ी देर लूप और परीक्षण ( [ … ]) निर्माण का उपयोग करें।

i=1
while [ "$i" -le "$numlines" ]; do
  
  i=$((i+1))
done

8

यदि आपको बचना चाहिए seq, जो टॉम हंट बताते हैं कि यह सामान्य उपाय है, तो evalनिश्चित रूप से ऐसा कर सकते हैं (हालांकि, मैं इसे प्रोत्साहित नहीं करूंगा):

eval 'for i in {1..'$numlines'}; do echo $i; done'

आप {} विस्तार से बचकर POSIX रह सकते हैं, और बस गणित और पूर्णांक तुलना पर कर सकते हैं $numlines:

while [ ! "$numlines" -eq 0 ]; do
     echo "$numlines"
     : $((numlines-=1))
done

POSIX के बाहर, bashऔर kshऔर zshभी सी-शैली है forछोरों:

for((i=0; i<numlines; i++)); do echo $i; done

1
मैं वास्तव में इस जवाब की सराहना करता हूं। जबकि seqमेरे परिदृश्य के लिए ठीक काम किया और सबसे सरल समाधान लग रहा था, यह जानना अच्छा है कि अन्य (यहां तक ​​कि पोसिक्स) विकल्प भी हैं। इसके लिए धन्यवाद।
rubynorails

2
उपयोग करने का वास्तव में कोई कारण नहीं है eval; यदि आपके पास ब्रेस विस्तार है, तो आपके पास सी-स्टाइल लूप है।
चेपनर

@PSkocik - अगर मैं 2 उत्तर चुन सकता हूं, तो मैं भी इसे चुनूंगा। जब मुझे इस तथ्य के बारे में पता चला कि मुझे इसके विपरीत करने की आवश्यकता है, तो आपका evalउदाहरण सबसे सरल था और मुझे इसका उपयोग करने के वैकल्पिक तरीके की खोज करने से बचाएगा seqwhileपाश मेरे लिए थोड़ा भारी है। मैं चीजों को छोटा और मीठा रखना पसंद करता हूं, और मुझे 0 या 1. का मान forदेकर काम करने के लिए सी-स्टाइल लूप कभी नहीं मिल सकता है i। यह कभी भी सही तरीके से वापस नहीं आया और हमेशा थोड़ा बंद था। मुझे यकीन है कि इसे सही तरीके से काम करने के लिए ट्वीक किया जा सकता है, लेकिन ये निश्चित रूप से सहायक समाधान हैं, फिर भी।
रुबिनोरेल्स

evalअगर वहाँ कुछ भी पाश के शरीर के अंदर गैर तुच्छ है दृष्टिकोण समस्याग्रस्त है। मुझे लगता है कि यह बहुत ही पठनीय नहीं होगा यदि आपको दो ऐसे लूपों को घोंसला बनाने की आवश्यकता होती है।
कैस्परर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.