linux - How to test if a variable is equal to a number in shell
2014-04
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?
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:
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"
fi
output:
#./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 ]; 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
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
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.