How to test if a variable is equal to a number in shell

I have this shell script that isn't working.

Input:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi

Output:

Server Name is 1

But, if i change Server_Name=2, the output is:

Server Name is 1

When I change Server_Name to 2, I want it to say: Server Name is 2.

I know it is the if [ $Server_Name=1 ]; part.

How do i fix it?


Solution 1:

Your script indicates you are using string comparisons.

Assume server name could be a string instead of number only.

For String comparisons:
if [[ "$Server_Name" == 1 ]]; then

Notes:

  • Spacing around == is a must
  • Spacing around = is a must
    if [ $Server_Name=1 ]; then is WRONG

  • [[ ... ]] reduces errors as no pathname expansion or word splitting takes place between [[ and ]]

  • Prefer quoting strings that are "words"

For Integer comparisons:
if [[ "$Server_Name" -eq 1 ]]; then


More information:

  • Bash Comparison Operators
  • SO: What is the difference between operator “=” and “==” in Bash?
  • Unix & Linux SE: Bash: double equals vs -eq

Solution 2:

Try this:

if [ $Server_Name -eq 1 ];then

Solution 3:

[ $Server_Name=1 ]

does not work as intended because the syntax inside the single brackets isn't special to Bash. As usual, the variable $Server_Name gets substituted by 1, so all the test ([) command sees is a single argument: the string 1=1. Since that sting has a non-zero length, test returns true.

For POSIX-compliant shells, you can use the following test commands:

[ "$Server_Name" = 1 ]

checks is the $Server_Name is equal to the string 1.

[ "$Server_Name" -eq 1 ]

checks is the $Server_Name is equal to the number 1, i.e., it does a numeric comparison instead of a string comparison.

The return value of the two command will differ, e.g., if you define Server_Name=01. The first one will return false, the second will return true.

Note that if the possibility exists that the variable $Server_Name is undefined, it must be quoted or test will display an error when invoked.

Solution 4:

Try,

 #!/bin/bash
 Server_Name=50
 if [ $Server_Name = 49 ]
 then
 echo "Server Name is 50"
 else
 echo "Server Name is below 50"
 fi

output:

 #./scriptname.sh
 Server Name is below 50