0

Hi I'm writing a shell script and I'm trying to get a starting number and an ending number from the user.
So if the users starting number is 3 and the ending number is 4, my program should print out 4 5 6 7 as the consecutive numbers. My problem however is that my program is printing "
./unixhw1.sh: line 20: [: too many arguments" over and over instead. How can I go about fixing it?
"

The shell script I'm working on

 #!/bin/bash
    echo "type the starting number"
    read num1

    echo "type how many consecutive numbers."
    read num2

    sum=`expr $num1 + $num2;`
    newnum=`expr $num1`;
    oddtotal=0;
    n=0;

    until [ "$n" -gt "$num2" ]; do
         if [ "$newnum" -lt "$sum" ] ; then
         newnum=$((newnum+1))
         echo "$newnum"
         n=$((n+1))
         fi

        if [ "$newnum" %2 -ne 0 ] ; then
        oddtotal=oddtotal+newnum;
        fi
    done

    echo "$num1 is the first number, the next $num2 cosective numbers are and so the
     sum of these odd numbers are $oddtotal"

My code using C++

 #include <iostream>
    using namespace std;

    int main()
    {
        int num, consecnum, sum, i, num3, j, oddtotal;
        oddtotal = 0; 

        cout<<"Enter a starting number"<<endl;
        cin>>num;

        cout<<"Enter a consecutive number."<<endl;
        cin>>consecnum;


        sum = num + consecnum; 
        num3 = num;

        cout<<" "<<endl; 

        for(i=0; num3<sum; i++) 
        {
             num3+=1;
             cout<<num3<<endl; 


        if(num3 % 2 != 0)
        {
             oddtotal+=num3;
        }

        }

        cout<<" "<<endl;
        cout<<num<<" is the first number, the next "<<consecnum<<" consecutive numbers are "<< " "<<"sum of odd nums "<<oddtotal<<endl;


        system("pause");
        return 0;


}
2
Contributors
9
Replies
11
Views
5 Years
Discussion Span
Last Post by Watael
0

hi,

inside this test

if [ "$newnum" %2 -ne 0 ] ; then

$newnum %2 needs to be 'arithmetically' evaluated.

also, numbers don't need to be quoted.

Edited by Watael

0

no!
use: if test $((newnum %2)) -ne 0; then...

or non-POSIX: if ((newnum %2)); then...
because, inside bash's arithmetic evaluation, zero returns an error;
so,
if evaluation is not zero, then true

NB: = and != are for lexical tests.

Edited by Watael

0

Ah ok, but why does "test" need to be added after "if". Also, the solution you gave works great but somehow my last echo statement isn't printing out.

0

because the until loop never ends, as $n is never greater than $num2, because $newnum is never equals to $sum.

#!/bin/bash

read -p 'type the starting number: ' num1

read -p 'type how many consecutive numbers: ' num2

for ((n=num1;n<=num2;n++))
do
   ((n%2?oddtotal+=n:0))
done

echo "$num1 is the first number, the next $num2 consecutive numbers are and so the
sum of these odd numbers are $oddtotal"
0

Sorry for the double post but if I wanted to the get the starting number and consecutive number using command line parameters would this be the way to do it?

#!/bin/bash
# sh unixhw1 1 2

echo "type the starting number $1"

echo "type how many consecutive numbers $2"

sum=`$1 + $2;`
newnum=`$1`;
oddtotal=0;
n=0;

until [ "$n" -gt "$2" ]; do
     if [ "$newnum" -lt "$sum" ] ; then
     newnum=$((newnum+1))
     echo "$newnum"
     let n+=1
     fi

     if test $((newnum % 2)) -ne 0; then
     oddtotal=oddtotal+newnum;
     fi
done

echo "$1 is the first number, the next $num2 cosective numbers are and so the su
m of these odd numbers are $oddtotal"

exit 0
0

sum=$1 + $2;

wrong: command substitution (backticks) doesn't evaluate arithmetics.
btw, expr is not part of shell, and is useless as shells are able to do arithmetic evaluation.

Edited by Watael

0

This code works except that "3" prints for the oddtotal when I enter 3 and 4 for num1 and num2 respectively. Something isn't right somewhere.

#!/bin/bash
read -p 'type the starting number: ' num1
read -p 'type how many consecutive numbers: ' num2
for ((n=num1;n<=num2;n++))
do
   ((n%2?oddtotal+=n:0))
done
echo "$num1 is the first number, the next $num2 consecutive numbers are and so t
he
sum of these odd numbers are $oddtotal"
0

myCode:

#!/bin/bash

read -p 'type the starting number: ' num1

read -p 'type how many consecutive numbers: ' num2

for (( n=num1; n<=num1+num2; n++))
do
   test $n -eq $num1 || { ar+=( $n ); ((n%2?oddtotal+=n:0));}
done
echo "the first number is $num1"
echo "the next $num2 consective numbers are ${ar[@]}"
echo "the sum of the odd numbers of this list is $oddtotal"

execution:

./myCode
type the starting number: 3
type how many consecutive numbers: 4
the first number is 3
the next 4 consective numbers are 4 5 6 7
the sum of the odd numbers of this list is 12
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.