2009-12-04 9 views
6

मैं स्क्रिप्टिंग को बाश करने के लिए काफी नया हूं और आमतौर पर इसे सभी लागतों से बचता हूं लेकिन मुझे रिमोट क्लस्टर पर कुछ सरल चीजों को निष्पादित करने के लिए एक बैश स्क्रिप्ट लिखनी है। मुझे लूप के साथ समस्याएं आ रही हैं जो निम्न कार्य करती हैं:लूप में सरल गणित बयान

for i in {1..20} 
do 
    for j in {1..20} 
    do 
     echo (i*i + j*j) **.5 <--- Pseudo code! 
    done 
done 

क्या आप इस सरल गणित के साथ मेरी सहायता कर सकते हैं? मैंने $ हर जगह फेंक दिया है और इसे ठीक से नहीं लिख सकता है। यदि आप मुझे समझने में मदद कर सकते हैं कि लूप के लिए बैश में कितने चर/नाम दिए गए हैं और बैश गणित व्याख्या की सीमाएं (आप वर्ग रूट कैसे करते हैं?) मैं बहुत आभारी हूं। धन्यवाद!

उत्तर

8

यहाँ एक सभ्य समाधान है:

for i in {1..20} 
do 
    for j in {1..20} 
    do 
     echo "scale = 3; sqrt($i*$i + $j*$j)" | bc 
    done 
done 

आउटपुट होगा:

1.414 
2.236 
3.162 
2.236 
[...etc...] 
0

एक चर का मूल्यांकन करने के लिए डबल पैर का उपयोग करें।

variableA = $ ((variableB * variableC))

ints के लिए केवल

हालांकि।

0

आमतौर पर आप $ ((1 * 3)) का उपयोग करेंगे, लेकिन आपका केस काम नहीं करेगा क्योंकि बैश फ्लोटिंग पॉइंट नंबरों का समर्थन नहीं करता है। आपको अजीब, बीसी या डीसी जैसे बाहरी उपकरण का उपयोग करना होगा: http://mywiki.wooledge.org/BashFAQ/022

2

शैल गणित कई तरीकों से किया जा सकता है।

echo $((i*i + j*j)) 
echo $[ i*i + j*j ] 
expr "$i" '*' "$i" '+' "$j" '*' "$j" 

हालांकि, यह केवल पूर्णांक अंकगणित संभाल सकता है। वांछित दशमलव स्थानों की संख्या को

echo "scale = 5; sqrt($i*$i + $j*$j)" | bc 

बदलें scale: इसके बजाय, आप bc उपयोग कर सकते हैं।

+0

मैं बहुत सारे (standard_in) हो रही है देखना 1: पार्स त्रुटि – physicsmichael

+0

आप शायद भूल रहे हैं ' ..' आपके {1..20} रेंज – dustmachine

+0

अजीब में आपके 1 और 20 के बीच, इसे किसी भी POSIX 'बीसी' में काम करना चाहिए। यदि आप 'डीसी' का उपयोग करते हैं तो क्या होगा? यानी 'डीसी-ई "5 के $ i $ i * $ जे $ जे * + वी पी" ' – ephemient

9

अंकगणित विस्तार $((...)) अंकन की जरूरत है, तो कुछ की तरह:

echo $((i*i + j*j)) 

हालांकि, पार्टी केवल पूर्णांकों का उपयोग करता है तो आप इस तरह के डीसी के रूप में एक बाहरी उपकरण का उपयोग करना पड़ सकता है।

उदा।

dc -e "18k $i $i * $j $j * + v p" 
0

कोड

अगर $X एक पूर्णांक है
echo $[(($i * $i) + ($j * $j)) ** $X] 

काम करेंगे। आप स्क्वायर रूट लेने की कोशिश कर रहे हैं, और मुझे यकीन नहीं है कि बैश के अंतर्निर्मित अंकगणित ऐसा करेंगे। इसके लिए आप शायद अधिक शक्तिशाली कैलकुलेटर टूल (bc, et al।) का उपयोग करके बेहतर हो जाएंगे।

2
#!/bin/bash 
for i in {1..20}; do 
    for j in {1..20}; do 
     echo 5k$i $i\* $j $j\*+vp | dc 
    done 
done 
+0

मेरा संस्करण: 'printf "% s% s 10kd * rd * + vp" "$ i" "$ j" | डीसी' –

0

बैश गणितीय कार्य प्रदान नहीं करता है। हालांकि, आप लगभग निश्चित रूप से कॉर्न खोल स्थापित किया है।यह काम करना चाहिए:

#!/bin/ksh 

for i in {1..20} 
do 
    for j in {1..20} 
    do 
     x=$((sqrt(i*i + j*j))) 
     echo "sqrt($i^2 + $j^2) = $x" 
    done 
done 

उत्पादन की शुरुआत

sqrt(1^2 + 1^2) = 1.41421356237309505 
sqrt(1^2 + 2^2) = 2.2360679774997897 
sqrt(1^2 + 3^2) = 3.16227766016837933 
sqrt(1^2 + 4^2) = 4.12310562561766055 
sqrt(1^2 + 5^2) = 5.09901951359278483 
sqrt(1^2 + 6^2) = 6.08276253029821969 
sqrt(1^2 + 7^2) = 7.07106781186547524 
sqrt(1^2 + 8^2) = 8.06225774829854965 
sqrt(1^2 + 9^2) = 9.05538513813741663 
sqrt(1^2 + 10^2) = 10.0498756211208903 
+0

"लगभग निश्चित रूप से"? मैंने देखा है कि किसी भी लिनक्स वितरण पर निश्चित रूप से मानक नहीं है। शायद आपका मतलब है * बीएसडी? – ephemient

+0

मैक ओएसएक्स 10.6 में यह है। – physicsmichael

+0

ओएसएक्स बीएसडी जैसा है। –

-1

पूर्णांक गणित अभिव्यक्ति का दूसरा रूप है में बैश काम के संचालन के लिए पूरे अभिव्यक्ति के बाहर डबल कोष्ठकों कहते हैं:

((var = i ** 2)) 
((i++)) 
((position += delta)) 

जैसा कि आप देख सकते हैं, डॉलर संकेतों की आवश्यकता नहीं है (न ही $(()) के अंदर)। इसके अलावा, बराबर चिह्न के आसपास रिक्त स्थान की अनुमति है।

इसके अलावा, इस प्रपत्र सशर्त में इस्तेमाल किया जा सकता:

sixpacks=8    # note spaces not allowed here 
((beerprice = 8)) # but you can use spaces this way 
budget=50 

# you can do assignments inside a conditional just like C 
until ((((beertotal = sixpacks * beerprice)) <= budget)) 
do 
    ((sixpacks--)) 
done 
echo "Buy ${sixpacks} six-packs at \$${beerprice} each for a total of \$${beertotal}." 

या आप इस के साथ वह सब जगह ले सकता है, ज़ाहिर है,:

:

beerprice=8 
budget=50 

# integer division 
((sixpacks = budget/beerprice)) 
((beertotal = sixpacks * beerprice)) 
echo "Buy ${sixpacks} six-packs at \$${beerprice} each for a total of \$${beertotal}." 

बैश भी एक let बयान है

let a=2**16 
let 'a>>=1' # bitwise shift - some operations need to be quoted or escaped 
((a>>=1)) # but not inside (()) 
1

क्या आपके रिमोट क्लस्टर में केवल बाश है? यदि नहीं, तो कोशिश करते हैं और अगर आप

awk 'BEGIN{ 
    for(i=1;i<=20;i++){ 
    for(j=1;j<=20;j++){ 
     print (i*i + j*j) ** 0.5 
    } 
    } 
}' 
0
zsh साथ

AWK है, यह काम करेंगे

for i in {1..20};do 
    for j in {1..20};do 
    echo $((($i*$i + $j*$j)**.5)) 
    done 
done 
संबंधित मुद्दे