将变量设置为除法和减法命令的结果

Kah*_*ahn 3 bash expr

我试图以纪元形式获取 2 个日期的差异,并将数字转换回天数:

EXPIRYEPOCH=$(date --date="$EXPIRYDATE" +%s)
TODAYEPOCH=$(date --date="$TODAYSDATE" +%s)
DAYSLEFT=$(expr ($EXPIRYEPOCH - $TODAYEPOCH) / 86400 )
Run Code Online (Sandbox Code Playgroud)

上面的计算DAYSLEFT失败 - 而下面的减法的单个计算成功:

DAYSLEFT=$(expr $EXPIRYEPOCH - $TODAYEPOCH)
Run Code Online (Sandbox Code Playgroud)

用于设置DAYSLEFT变量(先减后除)的正确格式是什么?

Gil*_*not 5

像这样(不要再使用过时的expr):

\n
dayleft=$(( arithmetic expression ))\n
Run Code Online (Sandbox Code Playgroud)\n

中需要浮点数,请使用代替:

\n
dayleft=$(bc -l <<< "scale=2; 100/3")\n
Run Code Online (Sandbox Code Playgroud)\n

正如St\xc3\xa9phane Chazelas在评论中所述, ksh93,zsh和确实支持和yash内的浮点。$((...))((...))

\n

expr是古代 shell 代码中用来做数学的程序。在 bash 等 Posix shell 中,使用$(( expression )). 在 bash、ksh88+、mksh/pdksh 或 zsh 中,您还可以使用(( expression ))let expression

\n
\n

((...))是一个算术命令,如果表达式非零,则返回退出状态 0;如果表达式为零,则返回 1。如果需要副作用(分配),也用作“let”的同义词。请参阅http://mywiki.wooledge.org/ArithmeticExpression

\n
\n

$((...))是算术替换。完成算术运算后,整个内容将被表达式的值替换。请参阅http://mywiki.wooledge.org/ArithmeticExpression

\n
\n

命令替换:"$(cmd "foo bar")"导致命令“cmd”使用参数“foo bar”执行,并将"$(..)"被输出替换。请参阅http://mywiki.wooledge.org/BashFAQ/002http://mywiki.wooledge.org/CommandSubstitution

\n
\n

避免使用大写变量,它们保留供系统使用

\n
\n

最后

\n
expiryepoch=$(date --date="$expirydate" +%s)\ntodayepoch=$(date --date="$todaysdate" +%s)\ndayleft=$(bc <<< "scale=2; (todayepoch - expiryepoch) / 86400")\n
Run Code Online (Sandbox Code Playgroud)\n