2013-07-17 37 views
2

這可能有點奇怪。我有一個字符串,表示每週的「允許」時間。該字符串長度爲168個字符。每個字符都是1或0.每個字符代表一週中的一個小時。因此,字符串中的前24個字符表示星期日的「允許」小時數。接下來的24個字符是星期一等等。數字1表示「允許」,數字0表示不允許。以下是一個示例字符串:Bash:根據「允許字符串」檢查當前日期時間

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

回答

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 

如果你想傳遞的字符串作爲參數,而不是一個文件,只需更換「貓$ 1' 第二個發言的部分:

echo $1 

注意:如果輸入的字符串比我值短,你會從外殼的兩個錯誤消息‘[:-eq:一元運算符預期’爲兩個如果條件隨着第3個回聲聲明。所以如果條件有點可能你想改善

同樣,只有當星期的開始時間爲星期日0小時時,上述代碼纔有效。否則,必須使用其他映射。

+0

我被困在busybox 1.19.4上,並且在這行上出現「替換錯誤」:i = $ {seq :i:1}。我確​​信這個腳本可以在更完整的shell上運行......不幸的是,它並不適用於我。:-( – exvance

+0

$ {seq:i:1}是一個bash語法,但是它可以用其他方法替換 – blackSmith

+0

現在看一下編輯,我用AWK替換了煩人的部分,並且糾正了第一條語句(而不是用24乘以星期一,I正在平方) – blackSmith

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 

請用您的真實數據進行測試,並報告是否有效。 :)

+0

我喜歡這樣的外觀,但它不適合我。無論我的文件包含什麼(例如全部爲1),它都會返回NOK。 :-( – exvance

+0

@exvance是你的awk gnu awk? – Kent

+0

這是在busybox 1.19.4中包含的awk ......我確信已經刪除了所有很酷的功能。 – exvance

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 
相關問題