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

时间:2018-01-09 17:24:55

标签: linux bash alpine

我是bash的新手,今天刚刚开始编写一个小程序员脚本。在mac和ubuntu上测试后一切正常。但是当我想在alpine linux中执行它时会抛出一个错误:算术语法错误。我无法理解为什么会这样,并且无法在谷歌叔叔身上找到解决方案。我希望有人可以帮助我。

这是表达式:

[ $((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

1 个答案:

答案 0 :(得分:3)

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

简单的答案是"不要这样做" - 也就是说,要么使用字符串比较而不是数字比较,要么在需要使用baseline-POSIX解释器运行时以不同的方式修剪前导0。

坚持使用数字路线:例如,将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