2

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

电动汽车

4

3 回答 3

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 值,您将来自 shell “ [: -eq: unary operator expected ” 的两条错误消息用于这两个if条件以及第三个echo语句。所以你可能想稍微改进一下if条件。

同样,上面的代码仅在一周的开始时间是星期日的第 0 个小时时才有效。否则必须使用一些其他映射。

于 2013-07-17T12:42:21.160 回答
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

请用您的真实数据对其进行测试,并报告它是否有效。:)

于 2013-07-17T08:55:48.563 回答
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
于 2013-07-17T09:30:38.223 回答