2

这是我在 UNIX(AIX) 上运行的脚本:

$MON date +"%m"
echo 'expr $MON - 2'

输出:

04
expr $MON - 2

我只想从当前月份中减去 2 并显示 .

4

3 回答 3

2

我意识到默认 shell onAIX是一些变体,ksh它不会遭受与bash输入库相同的缺陷,但如果您最终在另一个平台上遇到这种情况,请记住这一点。

如果这是您的输入:

$MON date +"%m"
echo 'expr $MON - 2'

那么你有几个问题。

  • $MON未设置,这会导致调用 line date +"%m",这会给出输出04
  • echo 命令不执行 expr 命令,因为您使用了错误的刻度,这会导致输出expr $MON - 2

首先,要分配您所做的变量VARIABLE=value,在您的情况下,这应该是:

MON=`date +"%m"`

不要在=标志之前或之后放置空格。

其次,要执行 expr,您需要使用反引号(`

echo `expr $MON - 2`

但是,对于大多数 shell,您应该使用更现代的i want to get the result of a command,这就是逻辑$(command)。这些可以嵌入,这使得它们更容易理解(反引号需要转义,反引号越多,需要的转义越多,这很快就会导致反斜杠-palooza)。对于 bash,您需要确保月份被解释为以 10 为基数的数字,否则一旦您到达八月,代码将停止工作:

要强制将数字解释为以 10 为底的数字,请在其前面加上10#

MON=10#$(date +"%m")
echo $(($MON-2))

例子:

bash-3.2$ month=07
bash-3.2$ echo $(($month + 1))
8
bash-3.2$ month=08
bash-3.2$ echo $(($month + 1))
bash: 08: value too great for base (error token is "08")
bash-3.2$ month=10#08
bash-3.2$ echo $(($month + 1))
9
于 2013-04-26T12:25:47.393 回答
1

尝试这个:

MON=$(date +"%m")
echo $(($MON-2))

您不需要使用expr,因为 bash 也可以执行简单的算术运算。

如果您的 shell 不支持算术表达式,请使用expr

expr $MON - 2 

在这两种情况下,您都会得到2输出。

于 2013-04-26T10:54:04.987 回答
1

另一种选择:如果你想在一月或二月看到 11 或 12,让 GNUdate做算术:

date -d "-2 months" +%m
于 2013-04-26T18:09:32.433 回答