1

所以,我这样做:

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# 

它只是没有给我我想要的东西。我想:

回显 $NUMBER

11,不评价到11?

我的问题是:

  1. 为什么我的第一次尝试不起作用?
  2. 我怎样才能让它发生?

顺便说一句,我仅限于 /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,但它是有限的,因为它是一个嵌入式平台。

4

3 回答 3

4

我想这就是你要找的:

$ NUMBER=$(expr `date +%d` - 1)
$ 回声 $NUMBER
11
$

这是有效的,因为 expr 是一个被评估的命令。要获得评估命令的输出,您可以使用$() 命令扩展或反引号

或者

$ NUMBER=$(expr $(date +%d) - 1)
$ 回声 $NUMBER
11
$

这几乎等同于第一个示例。注意$()比反引号更可取,因为它很容易嵌套而无需转义引号。

或者

$ NUMBER=$(($(日期 +%d) - 1))
$ 回声 $NUMBER
11
$

我们也可以不使用 expr 命令直接在 shell 中进行算术运算,使用$(( ))算术扩展。请参阅Advanced Bash-Scripting Guide 的算术扩展部分


更新

由于您使用的是busybox,因此即使是本月的第一天,您也可以使用它来正确计算日期:

$ 输入日期
日期别名为“忙箱日期”
$ NUMBER=$(date -D %s -d $(($(date +%s) - 86400)) +%d)
$ 回声 $NUMBER
11
$

尽管由于Unix Epoch Year 2038 问题,这会在 2038 年中断,所以请不要在核电站或空间站之类的地方实现它;-)

于 2013-11-12T15:41:37.517 回答
3

在本月的第一天,您想要什么 NUMBER:0 或上个月的最后一天?

我想知道你是否想要这个:number=$(date -d yesterday +%d)


给你,使用busybox awk:

yesterday=$(
    busybox awk 'BEGIN {
        today = strftime("%Y %m %d", systime())
        split(today, ymd)
        yesterday = ymd[1] " " ymd[2] " " (ymd[3]-1) " 0 0 0"
        print strftime("%d", mktime(yesterday))
    }'
)

awk 的 mktime 将第 0 天视为上个月的最后一天。例如,2012 年 3 月 1 日的“昨天”是 2 月 29 日:

$ busybox awk 'BEGIN {print strftime("%d", mktime("2012 03 00 0 0 0"))}'
29
于 2013-11-12T15:47:17.147 回答
1

你不需要expr$(( ... ))你的数值计算也是如此。

您应该改用以下语法:

NUMBER=$(( $(date +%e) - 1))

请注意,我使用了+%e修饰符而不是+%d,因此该date命令不会打印前导零,这将导致输出被解释为八进制基数(归功于 Glenn Jackman)。

于 2013-11-12T15:41:08.067 回答