Bash:对照“检查当前日期时间”;允许字符串";
这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为168个字符。每个字符都是1或0。每个字符代表一周中的一小时。因此,字符串中的前24个字符表示星期天的“允许”时间。接下来的24个字符是星期一,以此类推。数字1表示“允许”,数字0表示不允许。下面是一个示例字符串:Bash:对照“检查当前日期时间”;允许字符串";,bash,awk,grep,Bash,Awk,Grep,这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为168个字符。每个字符都是1或0。每个字符代表一周中的一小时。因此,字符串中的前24个字符表示星期天的“允许”时间。接下来的24个字符是星期一,以此类推。数字1表示“允许”,数字0表示不允许。下面是一个示例字符串: 000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111
000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000
此字符串表示周日到周六上午6点到晚上9点之间允许的时间。很多时候,一周中不同的日子会有不同的允许时间。我想弄清楚,如果今天的时间是“允许的”
我发现这些信息告诉我当前的日期和时间:
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有趣的问题 这里有一个一次性完成的awk解决方案。(没有
date
stuff):
请用您的真实数据测试它,并报告它是否有效。这是一个仅适用于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
下面是另一个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
如果要将字符串作为参数而不是文件传递,只需将第2条语句的“cat$1”部分替换为:
echo $1
注意:如果输入字符串短于i值,您将收到来自shell“[:-eq:unary operator expected”的两条错误消息,用于两个if条件以及第三条echo语句。因此,您可能需要稍微改进if条件
同样,上述代码仅在本周开始时间为星期日第0小时时有效。否则,必须使用其他映射。我喜欢这段代码的外观,但它对我不起作用。无论我的文件包含什么(例如,所有1),它都返回NOK:-(@exvance是您的awk gnu awk?它是busybox 1.19.4中包含的awk…我确信它删除了所有很酷的功能。我被困在busybox 1.19.4上,我在这一行上遇到了一个“替换错误”:I=${seq:I:1}。我确信这个脚本在更完整的shell上工作……不幸的是,它在我的shell上不起作用。(${seq:I:1}是bash语法。我不熟悉busybox。但是我想它可以用其他方式替换。现在看一下编辑。我用AWK替换了恼人的部分。还更正了第1条语句(不是将第0周乘以24,而是将其平方)。
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
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
echo $1