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