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

时间:2017-09-11 14:55:25

标签: string bash printf operator-keyword

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

2 个答案:

答案 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