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

String bash printf给我的字符串运算符无效,string,bash,printf,operator-keyword,String,Bash,Printf,Operator Keyword,我有一个脚本,它通过给当前月份分配一个变量来计算上个月的数值,检查该值是否为“01”,如果是,则将previous\u month变量分配到“12”,或者从值中减去1,然后将新值分配到previous\u month 下面是一段有问题的代码:一个变量声明和一个if语句 # Set current month current_month=`date +"%m"` # Check if current month = Jan if [ $current_month -eq "01" ] t

我有一个脚本,它通过给当前月份分配一个变量来计算上个月的数值,检查该值是否为“01”,如果是,则将
previous\u month
变量分配到“12”,或者从值中减去1,然后将新值分配到
previous\u 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

的话,则该变量有两个前导零字符
问题在于该数字被
printf
解释为八进制。因为我无法重现这个问题。你能检查一下这个解决方法是否有用吗

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


问题在于该数字被
printf
解释为八进制。因为我无法重现这个问题。你能检查一下这个解决方法是否有用吗

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


@skr并没有100%的答案,但他们给了我一些可以使用和测试的东西

我不得不在
current_month
变量周围使用大括号并添加
#0
,不确定这到底是做什么的,但我假设它允许
printf
将该值视为整数而不是字符串

变量
上个月
需要分配如下:

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

@skr并没有100%的答案,但他们给了我一些可以使用和测试的东西

我不得不在
current_month
变量周围使用大括号并添加
#0
,不确定这到底是做什么的,但我假设它允许
printf
将该值视为整数而不是字符串

变量
上个月
需要分配如下:

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

在Ubuntu16.04上工作(上个月结束时=08)“无效字符串运算符”不是来自
printf
,而是来自
expr
(并作为参数传递给
printf
)。您可能会遇到麻烦,因为前导“0”被视为八进制,因此“08”和“09”不是有效的数字。顺便说一句,当您使用
/bin/sh
启动脚本时,您正在覆盖其shebang行并使用
sh
shell(它可能是bash,也可能不是bash)。请注意,您可以将
$(expr$current\u month-1)
替换为
$($current\u month-1))
。除了正则表达式匹配之外,在现代POSIX环境中几乎不需要
expr
。在Ubuntu 16.04(上个月=08结尾)“无效字符串运算符”不是来自
printf
,而是来自
expr
(并作为参数传递给
printf
)。您可能会遇到麻烦,因为前导“0”被视为八进制,因此“08”和“09”不是有效的数字。顺便说一句,当您使用
/bin/sh
启动脚本时,您正在覆盖其shebang行并使用
sh
shell(它可能是bash,也可能不是bash)。请注意,您可以将
$(expr$current\u month-1)
替换为
$($current\u month-1))
。除了正则表达式匹配之外,在现代POSIX环境中几乎不需要
expr
。第一个给了我
无效格式字符串
,如果我做了第二个和
echo$value
,不幸的是,我得到的
无效字符串运算符
这两个都不起作用。第一个给我
无效格式字符串
,如果我做第二个和
echo$value
,我得到
无效字符串运算符