linux - shell 和变量中的 Expr 和日期

标签 linux bash shell

所以,我这样做:

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?

我的问题是:

  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,但由于它是一个嵌入式平台,所以有局限性。

最佳答案

我想这就是您要找的:

$ 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/

相关文章:

linux - 在 Bash 中查找重复字母的字谜

linux - 在 bash 脚本中查找并替换字符串(从字符串列表中)

windows - Windows CMD 中是否有与 bash 或 tcsh 中等效的源命令?

linux - 使用cmake与工具链文件交叉编译时如何使用find_package?

linux - 使用 Linux 进行 pdf 嵌入的高效图像压缩

bash - 如何获取通过setsid执行的进程的ID

python - 如何使用子进程转义路径名中的空格键?

linux - 如何设置用户的权限,以便它可以执行 bash 脚本来读取其他用户的文件?

shell - Cron xdotool 不运行

带有 fork 的子进程