2010-03-18 14 views
9

मैंने होमवर्क असाइनमेंट के लिए कुछ प्रोग्राम संकलित और चलाने के लिए एक .sh फ़ाइल लिखा था। मैं स्क्रिप्ट में पाश "के लिए" एक है, लेकिन जब तक मैं केवल पूर्णांकों का उपयोग यह काम नहीं करेगा:शैल लूप गैर-पूर्णांक का उपयोग कर?

#!/bin/bash 
for ((i=10; i<=100000; i+=100)) 
do 
    ./hw3_2_2 $i 
done 

चर $ मैं कार्यक्रम hw3_2_2 के लिए एक इनपुट है, और मैं गैर पूर्णांक मूल्यों मेरे पास है उपयोग करना पसंद है। दशमलव संख्याओं की सूची के साथ कोड को चलाने के माध्यम से मैं लूप कैसे कर सकता हूं?

उत्तर

9

सबसे आसान तरीका है बस उन्हें सूचीबद्ध करने के लिए है:

for a in 1.2 3.4 3.11 402.12 4.2 2342.40 
do 
    ./hw3_2_2 $a 
done 

तो सूची बहुत बड़ा है, तो आप एक शाब्दिक सूची के रूप में यह नहीं हो सकता, एक फ़ाइल में डंपिंग और फिर

की तरह कुछ प्रयोग करने पर विचार
for a in $(< my-numbers.txt) 
do 
    ./hw3_2_2 $a 
done 

$ (< my-numbers.txt) भाग स्क्रिप्ट के उस स्थान में नाम फ़ाइल की सामग्री को प्रतिस्थापित करने के लिए एक कुशल तरीका (बैश में) भाग है। डेनिस विलियमसन को यह इंगित करने के लिए धन्यवाद कि इसके लिए बाहरी cat कमांड का उपयोग करने की आवश्यकता नहीं है।

+2

'cat' की अनुपयोगी उपयोग। बैश में: '$ (

+0

@ डेनिस: सच, मैं सही कर दूंगा। धन्यवाद। – unwind

0

बैश दशमलव संख्याओं नहीं करता है। या तो bc जैसे कुछ का उपयोग करें जो या अधिक पूर्ण प्रोग्रामिंग भाषा में जा सकते हैं। हालांकि accuracy problems से सावधान रहें।

1

यहां एक और तरीका है। आप यहां डॉक का उपयोग कर सकते स्क्रिप्ट में अपने डेटा को शामिल करने के लिए:

read -d '' data <<EOF 
1.1 
2.12 
3.14159 
4 
5.05 
EOF 

for i in $data 
do 
    ./hw3_2_2 $i 
done 

इसी तरह:

array=(
1.1 
2.12 
3.14159 
4 
5.05 
) 

for i in ${array[@]} 
do 
    ./hw3_2_2 $i 
done 
8

आप awk का उपयोग उत्पन्न करने के लिए अपने दशमलव 0.1

num=$(awk 'BEGIN{for(i=1;i<=10;i+=0.1)print i}') 
for n in $num 
do 
    ./hw3_2_2 $n 
done 

या के कदम जैसे कर सकते हैं आप इसे पूरी तरह से awk में कर सकते हैं

awk 'BEGIN{cmd="hw3_2_2";for(i=1;i<=10;i+=0.1){c=cmd" "i;system(cmd) } }' 
+1

इस तरह की लूपों में फ्लोटिंग पॉइंट का उपयोग करना बुरा व्यवहार है क्योंकि यदि आप 0.1 से 1 जोड़ते रहेंगे तो आप कभी 10 तक नहीं पहुंचेंगे। काउंटर 9.9 99 99 99 99 99 99822 से 10.0 99 99 99 99 99 9982 तक कुछ होगा। – Gabe

+0

क्या आपने इसे आजमाया है? कृपया कोशिश करें और फिर मुझे बताएं कि यह 10 हो जाएगा। – ghostdog74

+0

यदि आप '<= 10' से' <10' बदलते हैं तो आप आउटपुट को बदलने की उम्मीद करेंगे, है ना? क्या यह? – Gabe

22

मुझे यह आश्चर्य की बात है कि पांच वर्षों में किसी ने कभी भी श्रेणियां उत्पन्न करने के लिए बनाई गई उपयोगिता का उल्लेख नहीं किया है, लेकिन फिर, यह 2005 के आसपास बीएसडी से आता है, और शायद यह आमतौर पर प्रश्न के समय लिनक्स पर भी उपलब्ध नहीं था बनाया गया था।

लेकिन यहाँ यह है:

for i in $(seq 0 0.1 1) 

या, (prepending या शून्य जोड़कर), -w का उपयोग एक ही चौड़ाई के साथ सभी नंबरों को मुद्रित करने के लिए। इससे "पूर्णांक" के रूप में भेजे जाने वाले नंबरों को रोकने में मदद मिलती है, अगर इससे समस्याएं उत्पन्न होंगी।

वाक्य रचना seq [first [incr]] last है, first 1 करने के लिए दोषी है, और incr या तो 1 या -1 के लिए दोषी, पर कि क्या last से अधिक या first से भी कम है निर्भर करता है के साथ। अन्य पैरामीटर के लिए, seq(1) देखें।

+0

यह निश्चित रूप से सही जवाब है! – rhombidodecahedron

+0

हाय डैनियल, क्या इस x.x.x को लूप के लिए बढ़ाने का कोई तरीका है? उदाहरण के लिए मैं $ (seq 1.0.20 0.0.1 1.0.24) में। या इस संस्करण को बढ़ाने के लिए कोई तरीका है और इसे एक सूची में जोड़ें ताकि मैं इसे लूप के लिए उपयोग कर सकूं? धन्यवाद! – user1164061

0

मैं आमतौर पर भी प्रति सेकंड जवाब के रूप में "seq" का उपयोग, लेकिन सिर्फ एक सटीक मजबूत पूर्णांक पाश के संदर्भ में एक जवाब देने के लिए और फिर एक नाव के लिए रूपांतरण BC:

#!/bin/bash 

for i in {2..10..2} ; do 
    x=`echo "scale=2 ; ${i}/10" | bc` 
    echo $x 
done 

देता है:

.2 .4 .6 .8 1,0