这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为168个字符。每个字符都是1或0.每个字符代表一周中的一个小时。因此,字符串中的前24个字符表示星期日的“允许”小时数。接下来的24个字符是星期一,依此类推。数字1表示“允许”,数字0表示不允许。这是一个示例字符串:
000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000
此字符串表示周日至周六上午6点至晚上9点之间的允许时间。很多时候,一周中不同的日子会有不同的允许时间。如果当前时间是“允许的”,我试图弄清楚bash。
我发现这些告诉我当前的日期和时间:
DATE=$(date)
day=$(echo $DATE | cut -d' ' -f1)
time=$(echo $DATE | cut -d' ' -f4 | cut -d: -f1-2 | tr -d ':')
然而,我无法找到一种优雅的方法来将它们与我的长串相比较 任何帮助将不胜感激!
请注意:我正在使用BusyBox 1.19.4。这意味着awk,sed,grep等可能不是全功能的。 : - (
EV
答案 0 :(得分:1)
这是另一个可以帮助你的bash版本。我假设输入字符串存储在一个文件中,并将作为参数传递给脚本:
i=`expr $(date +%w) \\* 24 + $(date +%H) + 1`
i=$(cat $1 | awk -v I=${i} '{print substr($0,I,1)}')
if [ $i -eq 1 ]
then echo "BUSY"
elif [ $i -eq 0 ]
then echo "FREE"
else
echo "error : input string is shorter than expected"
fi
如果要将字符串作为参数而不是文件传递,只需将第二个语句的'cat $ 1'部分替换为:
echo $1
注意:如果输入字符串比i值短,那么对于两个,如果 [: - eq:一元运算符预期”发出两条错误消息>条件以及第3个 echo 语句。因此,您可能希望稍微改善 if 条件。
同样,上面的代码只有在周开始时是星期日0小时才有效。否则必须使用其他一些映射。
答案 1 :(得分:0)
有趣的问题!
这是一次性完成的awk解决方案。 (没有date
个东西):
awk -v FIELDWIDTHS="24 24 24 24 24 24 24" '{split(strftime("%w,%H", systime()),t,",");for(i=0;i<7;i++)a[i]=$(i+1);print substr(a[t[1]],t[2]+1,1)?"OK":"NOK"}' file
为了更好的阅读:
awk -v FIELDWIDTHS="24 24 24 24 24 24 24" '{
split(strftime("%w,%H", systime()),t,",")
for(i=0;i<7;i++) a[i]=$(i+1)
print substr(a[t[1]],t[2]+1,1)?"OK":"NOK"
}' file
如果我现在运行(here is Wed. 10:58 AM)
,它会输出:
OK
请使用您的真实数据进行测试,并报告是否有效。 :)
答案 2 :(得分:0)
这是一个仅限bash的版本
startoweek=`date +%s -d 20130717`
#1373999400
current=$(date +%s)
let diff=(${current}-${startoweek})/3600
if [ $diff -ge 168 ]
then echo "Old Timetable"
exit
fi
work=000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000
allowed=${work:$diff:1}
if [ $allowed -eq 1 ]
then echo "Welcome"
elif [ $allowed -eq 0 ]
then echo "Go Home"
else
echo "Error"
fi