【发布时间】:2018-02-19 20:53:55
【问题描述】:
我有一个脚本,它通过将变量分配给当前月份来计算上个月的数值,检查该值是否为“01”,如果是,则将previous_month 变量分配给“12” ,或从值中减去 1 并将新值分配给 previous_month
这里是相关代码的 sn-p:变量声明和 if 语句
# Set current month
current_month=`date +"%m"`
# Check if current month = Jan
if [ $current_month -eq "01" ]
then
previous_month=12
else
previous_month=$(printf %02d $(expr $current_month - 1))
fi
这是运行 /bin/sh -x myScript.sh 的输出
+ [ 09 -eq 01 ]
+ expr 09 - 1
+ printf %02d Invalid string operator
+ previous_month=00
真正困扰我的是,这 a) 曾经可以工作,b) 如果我在 shell 中编写代码(复制/粘贴)就可以工作
我找不到让它工作的方法,如果月份是 ,我需要让 previous_month 变量带有前导零的两个字符
【问题讨论】:
-
在 Ubuntu 16.04 上工作(最后是 previous_month=08)
-
“无效的字符串运算符”不是来自
printf,而是来自expr(并作为参数传递给printf)。您可能会遇到将前导“0”视为八进制的数字的问题,因此“08”和“09”不是有效数字。顺便说一句,当您使用/bin/sh启动脚本时,您将覆盖它的shebang 行并使用shshell(实际上可能是也可能不是bash)。 -
请注意,您可以将
$(expr $current_month - 1)替换为$(( $current_month - 1))。除了正则表达式匹配,在现代 POSIX 环境中几乎不需要expr。
标签: string bash printf operator-keyword