仅在 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
我是 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