1

I get error [: -lt: unary operator expected after run below script, anyone can share ideas?

temp=0
while [ $temp -lt 25 ]
do
    sleep 1
        echo "running.."

   if [ $temp -eq 5 ]
   then
         top -bc -d 5 -n 1|sed -n '7,8p'|awk '{print $1,$9}'>>out.txt
         temp=`expr $temp +1`
         break
   elif [ $temp -eq 20 ]
   then
         top -bc -d 5 -n 1|sed -n '7,8p'|awk '{print $1,$9}'>>out.txt
         temp=`expr $temp +1`
   else
    temp=`expr $temp +1`
   fi
done

closed as off-topic by Michael Homer, Stephen Harris, Networker, LinuxSecurityFreak, Anthony G - justice for Monica Jan 14 at 12:05

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions describing a problem that can't be reproduced and seemingly went away on its own (or went away when a typo was fixed) are off-topic as they are unlikely to help future readers." – Michael Homer, Stephen Harris, Networker, LinuxSecurityFreak, Anthony G - justice for Monica
If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    Do you also get errors from expr? – Michael Homer Jan 14 at 1:52
  • no error shown on expr – Shi Jie Tio Jan 14 at 1:55
  • 2
    Use More Quotes™ – l0b0 Jan 14 at 2:12
  • 1
    Next time please tell us ALL the error messages you get. Not just the last one of a set. You would also have got expr: syntax error. – roaima Jan 14 at 8:47
10

Try changing all the +1s after the exprs to + 1.

Without the space expr will return an error and $temp will be empty. If $temp is empty, then the -lt will be comparing a blank space to a number, which is why the error appears. Here's a one liner that reproduces the problem:

t=0;t=`expr $t +1`;[ $t -lt 25 ]

Output (to STDERR):

expr: syntax error
bash: [: -lt: unary operator expected

Better yet, change all code that uses the external util expr to use the shell's own internal arithmetic expansion. So code like this:

temp=`expr $temp +1`

...should be changed to:

temp=$(($temp + 1))

Or, in bash, that whole line can be substituted with just:

((temp++))

Not the answer you're looking for? Browse other questions tagged or ask your own question.