[: too many arguments

Hi Guys

I have this small Bash script - but it fails when I'm trying to run it.
./test.sh: [: too many arguments

while true
do
MOUSE1=`cat /proc/interrupts | grep 12: | awk '{print $2}'`
KEY1=`cat /proc/interrupts | grep 1: | awk '{print $2}'`
sleep $TIME
MOUSE2=`cat /proc/interrupts | grep 12: | awk '{print $2}'`
KEY2=`cat /proc/interrupts | grep 1: | awk '{print $2}'`
if [ $MOUSE1 -eq $MOUSE2 ] && [ $KEY1 -eq $KEY2 ] ; then
# date >> /writable/sys/shutdown.log
shutdown -h "now"
exit
fi
done

Please, when posting scripts, use the [ code ]....[ /code ]-tags. They make it a lot easier to read.

The problem might be that your script is named "test" or in that "if [ ..." line.

Today all the "[...]"-mechanics are built into the shells, but back, in the good old days, there was a program called "test" and a link to this program called "[" (which is a legal program name, btw.). But the real program is called "test" and therefore it is unwise to call a script "test", like it would be unwise to call one "cat" or "grep".

When you write a line "if [ x = y ] ; then" you basically call this program "test" (respectively its link "[") and feed it "x = y ]" as parameters. "test" returns either "0" or "1" depending on what the outcome of the comparison is. Syntactically correct would also be:

if 0 ; then
     .....
else
     .....
fi

The error message now says that you fed "test" too many arguments. This might be the case because one of your variables contain not what they supposed to contain. Another point to consider in your code is that you nowhere make sure the variables are of the right type: "-eq" is only valid for comparing two integer values. If your variables do not contain integers (a space somewhere, leading or trailing would suffice) the comparison would also fail.

Finally yo do not need variables because you can compare directly. Here is a somewhat revised version of your code:

typeset -i MOUSE=0
typeset -i KEY=0

while : ; do
     MOUSE=$(awk '/12:/ {print $2}' /proc/interrupts)
     KEY=$(awk '/1:/ {print $2}' /proc/interrupts)

     sleep $TIME

     if [ \( $MOUSE -eq $(awk '/12:/{print $2}' /proc/interrupts) \) -a \
             $KEY -eq $(awk '/1:/{print $2}' /proc/interrupts) \)  \
        ] ; then
          #   date >> /writable/sys/shutdown.log
          shutdown -h "now"
          exit
     fi
done

I don't know your OS (guessing from the usage of the /proc-filesystem it is some Linux) and don't know exactly what is the form of /proc/interrupts is, but i would start looking at what awk does really extract from it:

echo \"$(awk '/12:/ {print $2}' /proc/interrupts)\"
echo \"$(awk '/1:/ {print $2}' /proc/interrupts)\"

I hope this helps.

bakunin

I think that the awk programs must be modified to ensure that only one value is returned (the last one) :

typeset -i MOUSE=0
typeset -i KEY=0

while : ; do
     MOUSE=$(awk '/12:/ {m=$2} END {print m}' /proc/interrupts)
     KEY=$(awk '/1:/ {k=$2} END {print k}' /proc/interrupts)

     sleep $TIME

     if [ \( $MOUSE -eq $(awk '/12:/ {m=$2} END {print m}' /proc/interrupts) \) -a \
             $KEY -eq $(awk '/1:/ {k=$2} END {print k}' /proc/interrupts) \)  \
        ] ; then
          #   date >> /writable/sys/shutdown.log
          shutdown -h "now"
          exit
     fi
done

Thank you! The script is working perfectly now....! The problem was
KEY1=`cat /proc/interrupts | grep 1: | awk '{print $2}'`
returned two values instead of one :slight_smile:

Useless use of cat and grep:

cat /proc/interrupts | grep 1: | awk '{print $2}'

is similar to:

awk '/1:/{print $2}' /proc/interrupts

Regards