所以,我这样做:
expr `date +%d` - 1
在 sh shell 中,它正确响应 11
。
但是如果我想把它存储在一个变量中:
-sh-4.2# NUMBER=expr `date +%d` - 1
-sh: 12: command not found
-sh-4.2# NUMBER=$((expr `date +%d` - 1))
-sh: expr 12 - 1: syntax error in expression (error token is "12 - 1")
-sh-4.2# NUMBER="expr `date +%d` - 1"
-sh-4.2# echo $NUMBER
expr 12 - 1
-sh-4.2# $NUMBER
11
-sh-4.2#
它只是没有给我我正在寻找的东西。我要:
echo $NUMBER
要说 11
,而不是评估为 11?
我的问题是:
- 为什么我的第一次尝试没有成功?
- 我怎样才能实现它?
顺便说一句,我仅限于/bin/sh GNU bash,版本 4.2.10(1)-release (mipsel-unknown-linux-uclibc)
编辑: 并且,日期非常有限。 BusyBox v1.19.4 (2013-10-30 00:56:51 PDT) 多调用二进制文件。 /编辑
虽然它是 bash,但由于它是一个嵌入式平台,所以有局限性。
最佳答案
我想这就是您要找的:
$ NUMBER=$(expr `date +%d` - 1) $ echo $NUMBER 11 $
这是可行的,因为 expr 是一个被评估的命令。要获得评估命令的输出,您可以使用 $() command expansion or backticks
或者
$ NUMBER=$(expr $(date +%d) - 1) $ echo $NUMBER 11 $
这与第一个示例非常相似。注意 $()
优于反引号,因为它很容易嵌套而无需转义引号。
或者
$ NUMBER=$(($(date +%d) - 1)) $ echo $NUMBER 11 $
我们也可以不使用 expr 命令直接在 shell 中进行算术运算,使用 $(( ))
算术展开。查看Arithmetic Expansion section of the Advanced Bash-Scripting Guide
更新
由于您使用的是 busybox,因此即使是当月的 1 日,您也可以使用这一口来正确计算日期:
$ type date date is aliased to `busybox date' $ NUMBER=$(date -D %s -d $(($(date +%s) - 86400)) +%d) $ echo $NUMBER 11 $
由于 Unix Epoch Year 2038 problem,这在 2038 年中断了, 所以请不要在核电站或空间站之类的地方实现它;-)
关于linux - shell 和变量中的 Expr 和日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19933423/