我是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
答案 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