Reputation: 3420
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?
Upvotes: 10
Views: 78356
Reputation: 206679
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
Upvotes: 24
Reputation: 530960
An unpractical answer, just to point out that since read
takes a variable name, the name can be specified by another variable.
choice=choice # A variable whose value is the string "choice"
read $choice # $choice expands to "choice", so read sets the value of that variable
if [[ $choice -eq 1 ]]; then # or (( choice == 1 ))
Upvotes: 4
Reputation: 123458
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
Upvotes: 6