【发布时间】:2013-04-20 12:35:52
【问题描述】:
这是我在 UNIX(AIX) 上运行的脚本:
$MON date +"%m"
echo 'expr $MON - 2'
输出:
04
expr $MON - 2
我只想从当前月份中减去 2 并显示。
【问题讨论】:
-
那么万一月份是0或1,你想显示什么?
这是我在 UNIX(AIX) 上运行的脚本:
$MON date +"%m"
echo 'expr $MON - 2'
输出:
04
expr $MON - 2
我只想从当前月份中减去 2 并显示。
【问题讨论】:
另一种选择:如果你想在一月或二月看到 11 或 12,让 GNU date 算术:
date -d "-2 months" +%m
【讨论】:
我意识到AIX 上的默认 shell 是 ksh 的一些变体,它在输入库中没有与 bash 相同的缺陷,但如果你最终要记住这一点在另一个平台上遇到这个。
如果这是您的输入:
$MON date +"%m"
echo 'expr $MON - 2'
那么你有几个问题。
$MON 未设置,这会导致调用行 date +"%m",从而给出输出 04
expr $MON - 2
首先,分配你所做的变量VARIABLE=value,在你的情况下应该是:
MON=`date +"%m"`
不要在= 符号之前或之后放置空格。
其次,要执行expr,你需要使用反引号(`)
echo `expr $MON - 2`
但是,对于大多数 shell,您应该使用更现代的版本我想获得命令的结果,这是逻辑$(command)。这些可以嵌入,这使得它们更容易理解(反引号需要转义,反引号越多,需要的转义越多,这很快就会导致反斜杠-palooza)。
对于 bash,您需要确保月份被解释为以 10 为基数的数字,否则一旦到了 8 月,代码将停止工作:
要强制将该数字解释为以 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
【讨论】:
试试这个:
MON=$(date +"%m")
echo $(($MON-2))
您不需要使用expr,因为 bash 也可以执行简单的算术运算。
如果您的 shell 不支持算术表达式,请使用 expr:
expr $MON - 2
在这两种情况下,您都会得到2 作为输出。
【讨论】:
MON=$(date +"%m")。