Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Integer comparison in Bash using if-else

I have a variable called choice. Now, I try to use if to compare the entered value:

read $choice

if [ "$choice" ==  2  ];then
       #do something
elif [ "$choice" == 1 ];then
       #do something else
else
     echo "Invalid choice!!"
fi

The output goes directly to invalid choice if I enter either 1 or 2. I tried to put quotes around 1 and 2 inside the if statement. Still didn't work. Using -eq gives me an error "Unary operator expected".What am I doing wrong here?

like image 364
rahuL Avatar asked Aug 10 '13 11:08

rahuL


2 Answers

Your read line is incorrect. Change it to:

read choice

i.e. use the name of the variable you want to set, not its value.

-eq is the correct test to compare integers. See man test for the descriptions (or man bash).

An alternative would be using arithmetic evaluation instead (but you still need the correct read statement):

read choice

if (( $choice == 2 )) ; then
    echo 2
elif (( $choice == 1 )) ; then
    echo 1
else
    echo "Invalid choice!!"
fi
like image 149
Mat Avatar answered Oct 23 '22 06:10

Mat


For your example, case seems to be what you probably want:

read choice

case "$choice" in
"1")
    echo choice 1;
    ;;
"2")
    echo choice 2;
    ;;
*)
    echo "invalid choice"
    ;;
esac
like image 29
devnull Avatar answered Oct 23 '22 06:10

devnull