【问题标题】:bash printf giving me Invalid String operatorbash printf 给我无效的字符串运算符
【发布时间】:2018-02-19 20:53:55
【问题描述】:

我有一个脚本,它通过将变量分配给当前月份来计算上个月的数值,检查该值是否为“01”,如果是,则将previous_month 变量分配给“12” ,或从值中减去 1 并将新值分配给 previous_month

这里是相关代码的 sn-p:变量声明和 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 中编写代码(复制/粘贴)就可以工作

我找不到让它工作的方法,如果月份是 ,我需要让 previous_month 变量带有前导零的两个字符

【问题讨论】:

  • 在 Ubuntu 16.04 上工作(最后是 previous_month=08)
  • “无效的字符串运算符”不是来自printf,而是来自expr(并作为参数传递给printf)。您可能会遇到将前导“0”视为八进制的数字的问题,因此“08”和“09”不是有效数字。顺便说一句,当您使用/bin/sh 启动脚本时,您将覆盖它的shebang 行并使用sh shell(实际上可能是也可能不是bash)。
  • 请注意,您可以将$(expr $current_month - 1) 替换为$(( $current_month - 1))。除了正则表达式匹配,在现代 POSIX 环境中几乎不需要 expr

标签: string bash printf operator-keyword


【解决方案1】:

问题是数字被printf 解释为八进制。由于我无法重现该问题。您能否检查一下此解决方法是否有帮助。

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

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

【讨论】:

  • 不幸的是,这些都不起作用。第一个给我invalid format string,如果我做第二个和echo $value,我得到Invalid string operator
【解决方案2】:

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

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

变量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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2018-08-17
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多