Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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?

share|improve this question
    
As David points out below, you must use "-eq" to test numeric values. You might also want to check for a blank variable to avoid errors; if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ... –  mikebabcock Dec 16 '13 at 1:41

5 Answers 5

up vote 1 down vote accepted

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:

share|improve this answer

if [ $Server_Name -eq 1 ];then

share|improve this answer
[ $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.

share|improve this answer

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
share|improve this answer

Simple answer. Your code is correct - almost. the only thing you are missing is spaces... (and well maybe an extra "=")

if [ $Server_Name=1 ]; then

will 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

share|improve this answer
    
Amazing so many answers there are in here.. –  Tobibobi Dec 16 '13 at 8:54

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.