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
fiOutput:
Server Name is 1But, if i change Server_Name=2, the output is:
Server Name is 1When 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?
15 Answers
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 ]; thenis 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
Try this:
if [ $Server_Name -eq 1 ];then [ $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.
Try,
#!/bin/bash Server_Name=50 if [ $Server_Name = 49 ] then echo "Server Name is 50" else echo "Server Name is below 50" fioutput:
#./scriptname.sh Server Name is below 50 Simple answer. Your code is correct - almost. the only thing you are missing is spaces... (and well maybe an extra "=")
if [ $Server_Name=1 ]; thenwill not compute correctly.
if [ $Server_Name == 1 ]; then is what you seek.
And now the statement about string versus numbers. Whenever you are searching for comparison like is / is-not, then == will always be fine.
And i assume you always have a server name as a string, not a number - right? ;-)
Good luck with your coding sturdy apprentice.
Ciao
0