带变量的bash expr计算(cygwin)

带变量的bash expr计算(cygwin),bash,shell,unix,variables,cygwin,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时间戳之间的差异。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主机上运行。我正在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)

我在Linux上看不到这个问题。但是你能用这句话得到正确的答案吗

B=`expr $TARGET - $CURRENT`
取代

B=`eval expr $TARGET - $CURRENT`

问题是我在Windows上编写脚本时,脚本的系统特定行结尾是
\r\n
。在切换到Unix行结尾
\n
后,它可以工作。

为什么不使用$[]?

您不需要调用
expr
,实际上只需使用bash的
$((expr))
功能即可。在我的cygwin上,此代码运行良好:

TARGET=1305281500
CURRENT=1305281554
A=$[42 - 23]
B=$[$TARGET - $CURRENT]
echo "A: $A"
echo "B: $B"
# !/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

bash--version
所显示的bash版本是什么?@Neil我使用的是bash版本4.1.10(4),不幸的是,这不起作用。也许这更像是cygwin或我的x64体系结构的问题……使用非标准的
$[…]
而不是标准的
$(…)
没有任何好处。
B: 8316
8316