[: too many arguments | Unix Linux Forums | Shell Programming and Scripting

  Go Back    


Shell Programming and Scripting Post questions about KSH, CSH, SH, BASH, PERL, PHP, SED, AWK and OTHER shell scripts and shell scripting languages here.

[: too many arguments

Shell Programming and Scripting


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 08-25-2008
tainted2real tainted2real is offline
Registered User
 
Join Date: Aug 2008
Last Activity: 26 August 2008, 4:01 AM EDT
Posts: 2
Thanks: 0
Thanked 0 Times in 0 Posts
[: 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
Sponsored Links
    #2  
Old 08-25-2008
bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
 
Join Date: May 2005
Last Activity: 24 October 2014, 6:36 PM EDT
Location: In the leftmost byte of /dev/kmem
Posts: 4,286
Thanks: 45
Thanked 824 Times in 651 Posts
Please, when posting scripts, use the [ code ]....[ /code ]-tags. They make it a lot easier to read.

Quote:
Originally Posted by tainted2real View Post
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
Sponsored Links
    #3  
Old 08-25-2008
aigles's Avatar
aigles aigles is offline Forum Advisor  
Registered User
 
Join Date: Apr 2004
Last Activity: 25 October 2014, 6:14 AM EDT
Location: Bordeaux, France
Posts: 1,711
Thanks: 2
Thanked 61 Times in 57 Posts
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
tainted2real tainted2real is offline
Registered User
 
Join Date: Aug 2008
Last Activity: 26 August 2008, 4:01 AM EDT
Posts: 2
Thanks: 0
Thanked 0 Times in 0 Posts
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
Sponsored Links
    #5  
Old 08-26-2008
Franklin52's Avatar
Franklin52 Franklin52 is offline Forum Staff  
Moderator
 
Join Date: Feb 2007
Last Activity: 23 October 2014, 7:38 AM EDT
Location: The Netherlands
Posts: 7,719
Thanks: 123
Thanked 538 Times in 508 Posts
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
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Too many arguments h0ujun Shell Programming and Scripting 4 02-15-2012 03:55 AM
Using arguments jsoper1 Shell Programming and Scripting 3 11-01-2011 04:02 PM
grep with two arguments to arguments to surch for Cybertron Shell Programming and Scripting 1 04-11-2011 04:46 AM
awk with arguments aoussenko Shell Programming and Scripting 5 12-14-2009 02:17 PM
Too many arguments? Alendrin Shell Programming and Scripting 3 03-05-2009 09:35 AM



All times are GMT -4. The time now is 09:23 AM.