String bash printf给我的字符串运算符无效
我有一个脚本,它通过给当前月份分配一个变量来计算上个月的数值,检查该值是否为“01”,如果是,则将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
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
,我得到无效字符串运算符