bash expr расчет с переменными (cygwin) - PullRequest
2 голосов
/ 13 мая 2011

Я пытаюсь вычислить разницу между двумя временными метками Unix. Расчет 42-23 только для целей тестирования.

# !/bin/bash
TARGET=1305281500
CURRENT=`date +%s`
echo $TARGET
echo $CURRENT
A=`expr 42 - 23`
B=`expr $TARGET - $CURRENT`
echo "A: $A"
echo "B: $B"

Выход:

1305281500
1305281554
expr: non-integer argument
A: 19
B:

В чем проблема вычитания одной переменной из другой? Скрипт работает на Unix-машине. Я использую Cygwin в Windows 7:

$ uname -a
CYGWIN_NT-6.1-WOW64 mypcname 1.7.9(0.237/5/3) 2011-03-29 10:10 i686 Cygwin

$ bash --version
GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)

Ответы [ 4 ]

4 голосов
/ 13 мая 2011

Вам не нужно звонить expr, для этого на самом деле просто используйте функцию bash $(( expr )). На моем cygwin этот код работает нормально:

# !/bin/bash
TARGET=1305281500
CURRENT=`date +%s`
echo $TARGET
echo $CURRENT
B=$((CURRENT - TARGET))
echo "B: $B"
# For validation only
echo "$TARGET $CURRENT" | awk '{print ($2-$1)}'

И он дал такой вывод:

B: 8316
8316
4 голосов
/ 13 мая 2011

Проблема заключалась в том, что я написал скрипт для Windows с системной строкой, оканчивающейся на \r\n. После перехода на строку Unix, заканчивающуюся \n, все работает.

3 голосов
/ 13 мая 2011

Почему бы не использовать $ []?

<code>TARGET=1305281500
CURRENT=1305281554
A=$[42 - 23]
B=$[$TARGET - $CURRENT]
echo "A: $A"
echo "B: $B"
вывод:
A: 19
B: -54
1 голос
/ 13 мая 2011

Я не вижу этой проблемы в Linux здесь.Но получите ли вы правильный ответ с помощью строки

B=`expr $TARGET - $CURRENT`

, замененной на

B=`eval expr $TARGET - $CURRENT`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...