仅在 alpine linux 上存在算术语法错误

Arithmetic syntax error only on alpine linux

我是 bash 的新手,今天才开始编写一个小调度程序。在 mac 和 ubuntu 上测试后一切正常。但是当我想在高山 linux 中执行它时,会抛出一个错误:算术语法错误。我无法理解为什么会这样,无法在google叔叔上找到解决方案。我希望有人能帮助我。

这是表达式:

[ $((10#$(date +"%H%M") != 10#$START_TIME)) = 1 ]

在显示这是如何的上下文中运行:

#!/bin/bash

START_TIME=2100
END_TIME=2200

#  arithmetic syntax error
while [ $((10#$(date +"%H%M") != 10#$START_TIME)) = 1 ]; do 
    sleep 10;
done

此代码依赖于 POSIX 未指定的语法,以确保将值解析为十进制数字,即使它们以前导 0 开头也是如此。

简单的答案是 "don't do that"——也就是说,要么使用字符串比较而不是数字比较,要么 trim 如果您需要 运行 与基线-POSIX 口译员。

坚持使用数字路线:例如,使用 sed 是低效的,但它有效:

START_TIME=2100 # this already doesn't start with a 0
while [ $(( $(date +"%H%M" | sed -e 's/^0+//') != START_TIME )) = 1 ]; do
  sleep 10
done

或者,直接使用字符串比较:

START_TIME=2100 # exactly four digits
while [ "$(date +"%H%M")" != "$START_TIME" ]; do
  sleep 10
done