Bash:针对“允许字符串”检查当前日期时间

时间:2013-07-17 08:30:42

标签: bash awk grep

这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为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

3 个答案:

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