bash printf 给我无效的字符串运算符

bash printf giving me Invalid String operator

我有一个脚本,它通过为当前月份分配一个变量来计算上个月的数值,检查该值是否为“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

这是 运行 /bin/sh -x myScript.sh

的输出
+ [ 09 -eq 01 ]
+ expr 09 - 1
+ printf %02d Invalid string operator
+ previous_month=00

真正困扰我的是 a) 曾经有效,b) 如果我将代码写在 shell(复制/粘贴)

中则有效

我找不到让这个工作的方法,如果月份小于 10

,我需要让 previous_month 变量有两个带前导零的字符

问题在于 printf 将数字解释为八进制。由于我无法重现 issue.Can 您检查此解决方法是否有帮助。

previous_month=$(printf "%0*d\n" 2 $(expr $current_month - 1))

value=$(expr $current_month - 1)
previous_month=$(printf %02d "${value#0}")

@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