Shell Script Too Many Arguments for if condition

10,303

Solution 1

Note that [ is actually synonym for the test builtin in shell (try which [ in your terminal), and not a conditional syntax like other languages, so you cannot do:

if [ [$i % 3] -eq 0 ]; then

Moreover, always make sure that there is at least one space between [, ], and the variables that comprise the logical condition check in between them.

The syntax for evaluating an expression such as modulo is enclosure by $((...)), and the variable names inside need not be prefixed by $:

remainder=$((i % 3))
if [ $remainder -eq 0 ]; then

Solution 2

You should probably use something like :

if [ $(($i % 3)) -eq 0 ]

instead of

if [ $i % 3 -eq 0 ]
if [ [$i % 3] -eq 0 ]

Solution 3

Your script could be greatly simplified. For example:

#!/bin/sh

n=0
while test $(( ++n )) -le ${1:-20}; do
  t=$n
  expr $n % 3 > /dev/null || { printf Uc; t=; }
  expr $n % 5 > /dev/null || { printf Bes; t=; }
  echo $t
done

gives slightly different error messages if the argument is not an integer, but otherwise behaves the same.

Share:
10,303
A. Mesut Konuklar
Author by

A. Mesut Konuklar

Updated on June 05, 2022

Comments

  • A. Mesut Konuklar
    A. Mesut Konuklar almost 2 years

    My current script does the following;

    It takes integer as a command line argument and starts from 1 to N , it checks whether the numbers are divisible by 3, 5 or both of them. It simply prints out Uc for 3, Bes for 5 and UcBes for 3,5. If the command line argument is empty, it does the same operation but the loop goes to 1 to 20.

    I am having this error "Too many arguments at line 11,15 and 19".

    Here is the code:

    #!/bin/bash
    
    if [ ! -z $1 ]; then
        for i in `seq 1 $1`
        do
            if [ [$i % 3] -eq 0 ]; then
                echo "Uc"
            elif [ i % 5 -eq 0 ]; then
                echo "Bes"
            elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
            then
                echo "UcBes"
            else
                echo "$i"
            fi
        done
    elif [ -z $1 ]
    then
        for i in {1..20}
        do
            if [ i % 3 -eq 0 ]
            then
                echo "Uc"
            elif [ i % 5 -eq 0 ]
            then
                echo "Bes"
            elif [ i % 3 -eq 0 ] && [ i % 5 -eq 0 ]
            then
                echo "UcBes"
            else
                echo "$i"
            fi
        done
    else
        echo "heheheh"
    fi