[: too many arguments


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting [: too many arguments
# 1  
Old 08-25-2008
[: 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
# 2  
Old 08-25-2008
Please, when posting scripts, use the [ code ]....[ /code ]-tags. They make it a lot easier to read.

Quote:
Originally Posted by tainted2real
Hi Guys
I have this small Bash script - but it fails when I'm trying to run it.
./test.sh: [: too many arguments

Code:
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

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:

Code:
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:

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
# 3  
Old 08-25-2008
I think that the awk programs must be modified to ensure that only one value is returned (the last one) :
Code:
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

# 4  
Old 08-26-2008
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 Smilie
# 5  
Old 08-26-2008
Useless use of cat and grep:

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

is similar to:

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

Regards
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Ubuntu

[: too many arguments

line 5: #!/bin/bash old=$(du -sh /home/andy/Downloads/myfile.iso) while true; do new=$(du -sh /home/andy/Downloads/myfile.iso) if ; then break fi old=$new xdotool getactivewindow key Ctrl sleep 5 done line 5: bash - Meaning of " (square brackets)... (9 Replies)
Discussion started by: drew77
9 Replies

2. Shell Programming and Scripting

Too many arguments

hi I have this code a="a b c" set -- $a if ; then echo empty fi why is it line 3 reports "test: [: too many arguments"? :wall: Thanks! (4 Replies)
Discussion started by: h0ujun
4 Replies

3. Shell Programming and Scripting

Using arguments

I have a SNMP agent that sends three arguments to the script to get a value at the end. The first is the LeafNumber, second is the request type (SET, GET, GETNEXT), and the last is a string that represents some value to be set(used only for set requests). The agent string looks like this: ... (3 Replies)
Discussion started by: jsoper1
3 Replies

4. Shell Programming and Scripting

: [: too many arguments in for -f in if

Hi Experts , I have following code if ; then mv path /filename newdirpath echo "K* files moved successfully to newdirpath \n" else echo "K* files DID NOT moved successfully to newdirpath \n" fi I am getting "echo "K* files DID NOT moved successfully to newdirpath \n"... (19 Replies)
Discussion started by: ajaypatil_am
19 Replies

5. Shell Programming and Scripting

grep with two arguments to arguments to surch for

Hello, is it possible to give grep two documents to surche for? like grep "test" /home/one.txt AND /home/two.txt ? thanks (1 Reply)
Discussion started by: Cybertron
1 Replies

6. Shell Programming and Scripting

Too many arguments

echo "the number from 1 to 10:" i=1 while do echo $i i=`expr $i+1' done above is the program i written in Linux O.S using vi editor but i am getting the error that while: line 3: i am not understanding that why i am getting this error. can any body please help me regarding this... (3 Replies)
Discussion started by: bsatishbabu
3 Replies

7. Shell Programming and Scripting

[: too many arguments

hi I am getting too many arguments error for the below line if ; then Thx in advance (1 Reply)
Discussion started by: vls1210
1 Replies

8. Shell Programming and Scripting

too many arguments?

i don't know what's wrong with the code, says too many arguments in the first two if statements. how to change it? thx. the file is like in this format: ;dfs;dfdsf;fsd ff dsf;dfdffdfd; -f2 should be only one word with no space, but could be like this 'n/a', '**ABC' while read line; do ... (1 Reply)
Discussion started by: dtdt
1 Replies

9. Shell Programming and Scripting

Too many arguments?

I can't find anything wrong with this line of code, it works when there is one file in the directory but more than one i get a "too many arguements2 error if ; then am i missing something? (3 Replies)
Discussion started by: Alendrin
3 Replies

10. UNIX for Dummies Questions & Answers

Arguments

Ok so i had to create a file and put some random text into it which i did. THen u make a script which takes 2 arguments. The first being a line of text, the second being your newly created file. The script should take the first argument and insert it into the very top (the first line) of... (1 Reply)
Discussion started by: iago
1 Replies
Login or Register to Ask a Question