2015-01-19 5 views
1

Я использую .conf, которые содержат ключи и значения.Сравнение значений в Linux

Некоторые клавиши содержат номера, как

deployment.conf

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

Когда я пытаюсь получить это значение, используя определенную клавишу и сравнить с целым значением, т.е. натуральное число.

Но независимо от того, что я получил значения из .conf, он должен быть строковым типом данных.

Как сравнить оба значения в сценарии Linux Bash.

Просто: Как сравнить два значения в Linux.?

Ex:

. ./deployment.conf 

count=$EAR_COUNT; 

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

Я получаю следующее сообщение об ошибке:

count : 2 
: integer expression expected30: [: 2 
+1

Не ясно, что вы имеете в виду строки и целое число. Можете ли вы добавить несколько примеров. – anubhava

ответ

1

Они все строки в bash, несмотря на вашу способность делать typeset -типа вещи, чтобы флаг их по-разному ,

Если вы хотите сделать числовые сравнения, просто использовать -eq (или его братьев, как -gt, -le), а не ==, != и так далее:

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

Полный спектр операторов сравнения можно найти в bash manpage, под CONDITIONAL EXPRESSIONS.

Если у вас есть что-то, что вы думаете должно быть числом, и это не работает, я ручаюсь это не число. Сделайте что-то вроде:

echo "[$count]" 

, чтобы убедиться, что он не имеет символа новой строки в конце или, еще лучше, получить дамп его в случае, если она имеет странные символы, такие как строки окончания Windows:

echo -n $count | od -xcb 

Тот факт, что вы видите:

: integer expression expected30: [: 2 

с : обратно в начале линии, а не более обычного:

-bash: [: XX: integer expression expected 

, как правило, указывает на наличие возврата каретки в то, что может быть от deployment.conf, имеющих эти концы строк Windows (\r\n, а не на UNIXy \n).

Штучный дамп должен сделать это очевидным, и в этот момент вам нужно пойти и очистить конфигурационный файл.

+0

'-gt' также является оператором цифрового сравнения. –

+0

@ManikandarajS: отсюда фраза «или ее братья». – paxdiablo

+0

ashokhein сам использовал числовой оператор сравнения '-gt' - "if [$ count -gt 0], затем" –

1

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

-eq, -ne, -lt, -le, -gt или -ge

  • Эти двоичные арифметические операторы в Баш сценариев.

Я проверил ваш код,

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 

выполнения выше скрипт вычисляет числовое сравнение для штрафа , Поделитесь с нами своим содержимым конфига, если вы столкнулись с какими-либо проблемами. Если вы включаете файл conf в файл сценария, обратите внимание, что файл conf должен иметь действительный Назначения BASH, что означает, что не должно быть места до и после знака '='.

Также вы упомянули WAR_COUNT = 3 в conf и использовали 'count = $ EAR_COUNT;' в скриптовой части. Пожалуйста, проверьте это тоже.

+0

Обновлено в вопросе. Я получаю следующую ошибку ... count: 2 : целое выражение expected30: [: 2 – ashokhein

+0

@ashokhein Я пробовал код, который вы опубликовали, он отлично работает. Попробуйте скачать здесь, https://www.dropbox.com/sh/4600b360s9hb3dj/AADwY_dHsgR7LP0773ZVd1Cca?dl=0 –

+0

У вас должно быть несколько символов \ r или \ n, добавленных в переменную EAR_COUNT, http: //www.unix .com/оболочка программирования, и-сценариев/146992-как-видеть-скрытых characters.html –

1

Скорее всего, у вас есть нецелый символ, например \r в переменной EAR_COUNT. Strip все не цифры при назначении на count как это:

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

echo "count : $count"; 
if [[ $count -gt 0 ]]; then 
    echo "Test" 
fi 
Смежные вопросы