ashokhein
ashokhein

Reputation: 1058

Compare values in Linux

I'm using .conf which contain keys and values.

Some keys contains numbers like

deployment.conf

EAR_COUNT=2
EAR_1=xxx.ear
EAR_2=yyy.ear

When I try to retrieve that value using particular key and compare with integer value i.e. natural number.

But Whatever I retrieved values from .conf ,it is should be String datatype.

How should I compare both value in Linux Bash script.

Simply : How should I compare two values in Linux.?

Ex :

. ./deployment.conf

count=$EAR_COUNT;

echo "count : $count";
if [ $count -gt 0 ]; then
    echo "Test"
fi

I'm getting following error :

count : 2
: integer expression expected30: [: 2

Upvotes: 1

Views: 401

Answers (3)

paxdiablo
paxdiablo

Reputation: 881113

They're all strings in bash, notwithstanding your ability to do typeset-type things to flag them differently.

If you want to do numeric comparisons, just use -eq (or its brethren like -gt, -le) rather than ==, != and so on:

if [[ $num -eq 42 ]] ; then
    echo Found the answer
fi

The full range of comparison operators can be found in the bash manpage, under CONDITIONAL EXPRESSIONS.

If you have something that you think should be a number and it's not working, I'll warrant it's not a number. Do something like:

echo "[$count]"

to make sure it doesn't have a newline at the end or, better yet, get a hex dump of it in case it holds strange characters, like Windows line endings:

echo -n $count | od -xcb

The fact that you're seeing:

: integer expression expected30: [: 2

with the : back at the start of the line, rather than the more usual:

-bash: [: XX: integer expression expected

tends to indicate the presence of a carriage return in there, which might be from deployment.conf having those Windows line endings (\r\n rather than the UNIXy \n).

The hex dump should make that obvious, at which point you need to go and clean up your configuration file.

Upvotes: 2

anubhava
anubhava

Reputation: 784898

Most likely you have some non-integer character like \r in your EAR_COUNT variable. Strip all non-digits while assigning to count like this:

count=${EAR_COUNT//[^[:digit:]]/}

echo "count : $count";
if [[ $count -gt 0 ]]; then
    echo "Test"
fi

Upvotes: 1

Manikandaraj Srinivasan
Manikandaraj Srinivasan

Reputation: 3647

Ref : http://linux.die.net/man/1/bash

-eq, -ne, -lt, -le, -gt, or -ge

  • These are arithmetic binary operators in bash scripting.

I have checked your code,

deployment.conf

# CONF FILE 
EAR_COUNT=5

testArithmetic.sh

#!/bin/bash
. ./deployment.conf

count=$EAR_COUNT;

echo "count : $count";
if [ $count -gt 0 ]; then
    echo "Test"
fi

running the above script evaluates to numeric comparison for fine. Share us your conf file contents, if you are facing any issues. If you are including the conf file in your script file, note the conf file must have valid BASH assignments, which means, there should be no space before and after '=' sign.

Also, you have mentioned WAR_COUNT=3 in conf part and used 'count=$EAR_COUNT;' in script part. Please check this too.

Upvotes: 1

Related Questions