ANBHOO
ANBHOO

Reputation: 135

Bash scripting using an exit status in an if statement

May be a novice question but anyways in my intro to linux/unix class were touching on bash scripting and in one of the problems I got the it tasked me with making a script so if the user searched to a name in a file that wasn't there it would output a messaged saying 'your_input is not in the directory'

It says to use if statements and the exit status $?.

So far I got the input portion but I'm not sure how to properly use the $? in a if statement if its possible.

#!/bin/bash
name=$1

if [ "$name" = "" ]

   then echo -n "Enter a name to search for: "

        read name

fi

grep -i $name ~uli101/2014c/phonebook

if [ "$?" < "0" ]

   then echo "error"

fi

I get the error:

./phone4: line 14: 0: No such file or directory

My question is: How can I use the $? with and if statement, and If I can't, can you explain me how to use the $? in this problem?

Note: I did use echo $? to see how $? gave a 0 if grep worked and a 1 if it didn't.

Upvotes: 0

Views: 2512

Answers (4)

tvCa
tvCa

Reputation: 816

The "$?" doesn't need quotes, as it is a number really. If you want better script, check on existance of the Phonebook file, and exit before asking the Name input if the file is missing. Also, if you reply nothing (enter only) on the READ command, you may need to do something.

#!/bin/bash

name=$1
phonebook=~/phonebook

if [ "$name" = "" ]
  then
  echo -n "Enter a name to search for: "
  read name
fi

grep -i "$name" $phonebook

if [ $? -gt 0 ]
  then
  echo "error, no \"$name\" in $phonebook"
fi

Upvotes: 0

pelya
pelya

Reputation: 4524

It should be

if [ "$?" -gt 0 ]

The symbol '<' is a redirection operator, and it's not a Python or C - everything in a shell script is a command, including the text after 'if', and you are executing a command named '[' here, you may find it at the location /usr/bin/[, and this command uses -gt and -lt parameters to compare numbers, instead of '>' and '<', which are special shell operators.

You can rewrite this code like this:

if grep -i "$name" ~uli101/2014c/phonebook
  then true # 'true' is also a command, which does nothing and returns success
  else echo "Error"
fi

or even like this, using '||' operator, which will execute following command only if previous command returned an error:

grep -i "$name" ~uli101/2014c/phonebook || echo "Error"

Upvotes: 0

Wintermute
Wintermute

Reputation: 44073

There's two bugs in it. The one you already see is that in the [] expression, the < is interpreted not as "less than" but as stream redirection operator. The reason is that [ is just another program (an alias for test), so [ "$?" < "0" ] is similar to cat < filename. The other error is that you don't want to check for "less than" but for "not equal". In sum:

if [ "$?" < "0" ]

should be

if [ "$?" -ne "0" ]

Or you could write

if ! grep "$name" ~uli101/2014c/phonebook

...because if interprets a return code of zero as true and everything else as false.

Upvotes: 3

ANBHOO
ANBHOO

Reputation: 135

never mind one of my friends pushed me in the right direction:

all I had to do is:

    if [ "$?" = "1" ]
       then echo "error"

fi

pretty much I was over thinking it, I just needed to say if $? = 1 then error, because in the readings it said $? can be greater then 1 I was trying to compensate for that.

Upvotes: 0

Related Questions