带变量的bash expr计算(cygwin)

时间:2011-05-13 10:22:18

标签: bash shell unix variables cygwin

我正在尝试计算两个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 maschine。我在Windows 7上使用Cygwin:

$ 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 个答案:

答案 0 :(得分:4)

问题是我在Windows上编写了脚本,其系统特定的行结尾为\r\n。在更改为结束\n的Unix行之后,它可以正常工作。

答案 1 :(得分:4)

您实际上只需使用bash的expr功能即可调用$(( 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

答案 2 :(得分:3)

为什么不使用$ []?

TARGET=1305281500
CURRENT=1305281554
A=$[42 - 23]
B=$[$TARGET - $CURRENT]
echo "A: $A"
echo "B: $B"
输出:
A: 19
B: -54

答案 3 :(得分:1)

我在Linux上没有看到这个问题。但是你能用线

得到正确答案吗?
B=`expr $TARGET - $CURRENT`

替换为

B=`eval expr $TARGET - $CURRENT`