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

06
2014-04
  • user2649805

    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?

  • Answers
  • Ivan Chau

    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:

  • David Dai

    if [ $Server_Name -eq 1 ];then

  • Dennis
    [ $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.

  • Ranjithkumar T

    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
    
  • Tobibobi

    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


  • Related Question

    linux - Bash & 'su' script giving an error "standard in must be a tty"
  • sHz

    Folks, I'm having an issue with a bash script which runs a particular command as a different user.

    The background: Running on a Linux box (CentOS), the script is quite simple, it's starting the hudson-ci application.

    declare -r HOME=/home/hudson
    declare -r RUNAS=hudson
    declare -r HOME=/home/hudson
    declare -r LOG=hudson.log
    declare -r PID=hudson.pid
    declare -r BINARY=hudson.war
    
    su - ${RUNAS} -c "nohup java -jar ${HOME}/${BINARY} >> ${HOME}/${LOG} 2>&1; echo $! > ${HOME}/${PID}" &
    

    This is the abridged version of the script, when run, the script exits with "standard in must be a tty". Any ideas on what I could be doing wrong? I've tried Dr Google and all the advice hasn't helped thus far.

    Other reference: Mandriva Linux 'su' bug


  • Related Answers
  • Eric3

    In your /etc/sudoers file, try commenting out the line that says "Defaults requiretty". There are security implications of doing so, so you might want to instead add this line below:

    Defaults:[username] !requiretty
    

    Be sure to use the visudo command to edit this file, rather than a regular text editor.