我有一个脚本,通过为当前月份分配变量来计算上个月的数值,检查该值是否为“01”,如果是,则将previous_month
变量分配给' 12',或从值中减1并将该新值分配给previous_month
以下是相关代码的片段:变量声明和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
这是来自running / bin / sh -x myScript.sh
的输出+ [ 09 -eq 01 ]
+ expr 09 - 1
+ printf %02d Invalid string operator
+ previous_month=00
真正困扰我的是这个a)曾经工作,而b)如果我在shell中编写代码(复制/粘贴)
我找不到让这个工作的方法,如果月份是<我需要让previous_month
变量两个字符带前导零。 10
答案 0 :(得分:1)
问题在于printf
将数字解释为OCTAL。由于我无法重现该问题。您可以检查这项工作是否有帮助。
previous_month=$(printf "%0*d\n" 2 $(expr $current_month - 1))
或
value=$(expr $current_month - 1)
previous_month=$(printf %02d "${value#0}")
答案 1 :(得分:1)
@skr没有得到100%的答案,但是他们给了我一些工作和测试。
我必须使用current_month
变量周围的花括号并添加#0
,不确定这是什么,确切地说,但我假设它允许printf
看到该值作为整数而不是字符串。
变量previous_month
需要按如下方式分配:
previous_month=$(printf %02d $(expr ${current_month#0} - 1))
这是运行/bin/sh -x myScript.sh
+ [ 09 -eq 01 ]
+ expr 9 - 1
+ printf %02d 8
+ previous_month=08