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

Bash:对照“检查当前日期时间”;允许字符串";,bash,awk,grep,Bash,Awk,Grep,这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为168个字符。每个字符都是1或0。每个字符代表一周中的一小时。因此,字符串中的前24个字符表示星期天的“允许”时间。接下来的24个字符是星期一,以此类推。数字1表示“允许”,数字0表示不允许。下面是一个示例字符串: 000000111111111111111000000000111111111111111000000000111111111111111000000000111111111111111000000000111

这可能有点奇怪。我有一个字符串,表示每周所有“允许”的时间。字符串长度为168个字符。每个字符都是1或0。每个字符代表一周中的一小时。因此,字符串中的前24个字符表示星期天的“允许”时间。接下来的24个字符是星期一,以此类推。数字1表示“允许”,数字0表示不允许。下面是一个示例字符串:

 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