Programming Forums

Programming Forums (http://www.programmingforums.org/forumindex.php)
-   Bash / Shell Scripting (http://www.programmingforums.org/forum26.html)
-   -   $$i and rounding (http://www.programmingforums.org/showthread.php?t=11099)

a thing Aug 17th, 2006 1:36 AM

$$i and rounding
 
I was looking back through the threads I started and came across http://programmingforums.org/forum/s...38&postcount=6. I thought that would be more accurate, so I've been trying to construct a function that prints the fastest domain from the list of domains given to it. So far I have:
:

#!/bin/sh

getmirror()
{
        declare -a averages #Make sure $averages doesn't get thrown away too soon by garbage collection.
        i=0
        for mirror; do
                averages[i]="$(ping -c 2 $mirror|tail -n1|cut -d/ -f5|cut -d. -f1)"
                i=$(expr $i + 1)
        done
        IFS="
" #So sort will count different elements of $averages as different values.
        bestaverage=$(echo "${averages[*]}"|sort -n|head -n1)
        size="${#averages[*]}"
        echo $bestaverage
        for (( i=0; "${averages[i]}" != "$bestaverage"; i++ )); do echo; done #The shell complains if there's nothing between do and ;done.
        echo $i
}

echo $(getmirror jaist.dl.sourceforge.net switch.dl.sourceforge.net easynews.dl.sourceforge.net)


My problems:
1. How would I reference the argument number $i? So if $i == 2, then reference $2. Like $$i, but that's not the correct syntax.
2. What's the best way to round a number? [ complains if there are decimals passed to it. cut -d. -f1 sort of works, but it isn't the most accurate.

a thing Aug 23rd, 2006 1:45 AM

Kabump.

DaWei Aug 23rd, 2006 9:08 AM

1. Sorry, not familiar with bash.
2. Presuming you mean round to the nearest integer, add .5 to the number, then floor it (truncate the decimals).

jim mcnamara Aug 23rd, 2006 4:38 PM

The print command line utility will round numbers.
:

z=2.111
printf "%.0f\n" $z


stick a :; between do and done That's a colon semicolon

Finally, I don't understand what you mean by reference $i. You want to get
the value of i outside the function? Or the value of the array element referenced by i - the array you declare inside the function?

Note: i only has scope during the "for" loop inside the getmirror function. The array "averages" only has scope inside the getmirror function.

They do not exist outside their scope.

a thing Aug 23rd, 2006 10:57 PM

Quote:

Originally Posted by jim mcnamara
The print command line utility will round numbers.
:

z=2.111
printf "%.0f\n" $z


Thanks, that worked. Now I have
:

averages[i]="$(printf "%.0f" $(ping -c 2 $mirror|tail -n1|cut -d/ -f5))"

DaWei, I'll remember that for other languages.

Quote:

Originally Posted by jim mcnamara
stick a :; between do and done That's a colon semicolon

That worked too :) By the way, does : ever do anything?

Quote:

Originally Posted by jim mcmamara
Finally, I don't understand what you mean by reference $i. You want to get
the value of i outside the function? Or the value of the array element referenced by i - the array you declare inside the function?

Note: i only has scope during the "for" loop inside the getmirror function. The array "averages" only has scope inside the getmirror function.

They do not exist outside their scope.

1. See the comment on line 5.
2. Reread #1 in the first post. (If I referenced the array element referenced by $i I'd just get the best average, not the fastest domain.)

Meh, I gotta get used to going from 8 VDs to 12.

Oo 100 posts!

a thing Sep 24th, 2006 5:40 PM

I've got it! $(eval "echo $""$i")


All times are GMT -5. The time now is 12:52 AM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC