2008-10-22 15 views
6

शैल ksh स्क्रिप्ट में पिछले व्यावसायिक दिन की गणना करने का सबसे शानदार तरीका क्या है?मैं ksh shell script में पिछले व्यावसायिक दिन की गणना कैसे करूं?

क्या मैं अब तक मिल गया है:

#!/bin/ksh 

set -x 

DAY_DIFF=1 
case `date '+%a'` in 
"Sun") 
    DAY_DIFF=2 
    ;; 
"Mon") 
    DAY_DIFF=3 
    ;; 
esac 

PREV_DT=`perl -e '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time()-${DAY_DIFF}*24*60*60);printf "%4d%02d%02d",$year+1900,$mon+1,$mday;'` 

echo $PREV_DT 

मैं कैसे नहीं स्ट्रिंग के रूप में $ {DAY_DIFF} चर मूल्य के रूप में प्रसारित करने की बनाने के लिए और कर सकता हूँ?

+0

आप बाहर शनिवार छोड़ दिया है ... –

+0

स्क्रैच कि - यह मामला पहले DAY_DIFF = 1 की डिफ़ॉल्ट सेटिंग से आच्छादित है ... यह स्पष्ट हो सकता है अगर डिफ़ॉल्ट के मामले में किया गया था। –

+0

'मैं कैसे करूँ ...' प्रश्न का सीधा जवाब है: perl कमांड में $ {DAY_DIFF} के बाद एक और पहले एक उद्धरण रखें। –

उत्तर

0

ठीक है, यदि पर्ल को स्क्रिप्ट के हिस्से के रूप में गिना जाता है, तो पर्ल में जवाब विकसित करें। अगला सवाल यह है कि - एक व्यापार दिवस क्या परिभाषित करता है? क्या आप एक दुकान/दुकान है जो रविवार को खुली है? शनिवार? या 9-5 सोमवार से शुक्रवार का व्यवसाय? छुट्टियों के बारे में क्या?

मान लीजिए कि आप सोमवार से शुक्रवार को सोच रहे हैं और छुट्टियां अस्थायी रूप से अचूक हैं, तो आप पर्ल में एक एल्गोरिदम का उपयोग कर सकते हैं जो नोट करता है कि रविवार को शनिवार को 6 बजे रविवार को 6 दिन होगा, और इसलिए यदि दिन 1 है, तो आपको समय से 3 * 86400 घटाएं(); यदि wday 0 है, तो आपको 2 * 86400 घटाना होगा; और अगर wday 6 है, तो आप घटाना 1 * 86400. है कि क्या तुम कॉर्न खोल सामान में मिल गया है की जरूरत है - बस बजाय पर्ल में यह कार्य करें:

#!/bin/perl -w 
use strict; 
use POSIX; 
use constant SECS_PER_DAY => 24 * 60 * 60; 
my(@days) = (2, 3, 1, 1, 1, 1, 1); 
my($now) = time; 
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($now); 
print strftime("%Y-%m-%d\n", localtime($now - $days[$wday] * SECS_PER_DAY)); 

यह आपको POSIX मॉड्यूल है मान करता है; यदि नहीं, तो आपको लगभग उसी printf() को करने की आवश्यकता होगी जैसा आपने उपयोग किया था। मैं वरीयताओं के लिए आईएसओ 8601 प्रारूप का भी उपयोग करता हूं (एक्सएसडी और एसक्यूएल द्वारा भी उपयोग किया जाता है) - इसलिए सचित्र प्रारूप।

+0

'बिजनेस डे' एक मानक शब्द है जिसमें कभी भी सूर्य और सूर्य शामिल नहीं होता है। – jwg

2

यहां एक समाधान है जो पर्ल का उपयोग नहीं करता है। यह ksh और sh दोनों के साथ काम करता है।

#!/bin/ksh 

diff=-1 
[ `date +%u` == 1 ] && diff=-3 

seconds=$((`date +%s` + $diff * 24 * 3600)) 
format=+%Y-%m-%d 

if date --help 2>/dev/null | grep -q -- -d ; then 
    # GNU date (e.g., Linux) 
    date -d "1970-01-01 00:00 UTC + $seconds seconds" $format 
else 
    # For BSD date (e.g., Mac OS X) 
    date -r $seconds $format 
fi 
3
#!/bin/ksh 
# GNU date is a veritable Swiss Army Knife... 
((D=$(date +%w)+2)) 
if [ $D -gt 3 ]; then D=1; fi 
PREV_DT=$(date -d "-$D days" +%F) 
0

यह सोलारिस और लिनक्स के लिए काम करना चाहिए। यह यूनिक्स पर वास्तव में जटिल है कि आप सभी यूनिक्स व्युत्पन्नों पर समान कमांडलाइन तर्कों का उपयोग नहीं कर सकते हैं।

लिनक्स पर आप date -d '-d24 hour ago' का उपयोग पर सोलारिस अपने TZ=CET+24 date अंतिम दिन प्राप्त करने के लिए कर सकते हैं। मुझे लगता है कि अन्य यूनिक्स 'वैसे ही काम करता है जैसे सोलारिस करता है।

#!/usr/bin/ksh 

lbd=5    # last business day (1=Mon, 2=Thu ... 6=Sat, 7=Sun) 
lbd_date=""   # last business day date 

function lbdSunOS 
{ 
    typeset back=$1 
    typeset tz=`date '+%Z'`  # timezone 

    lbd_date=`TZ=${tz}+$back date '+%Y%m%d'` 
} 

function lbdLinux 
{ 
    typeset back=$1 

    lbd_date=`date -d "-d$back hour ago"` 
} 

function calcHoursBack 
{ 
    typeset lbd=$1 
    typeset dow=`date '+%u'` # day of the week 

    if [ $dow -ge $lbd ] 
    then 
     return $(((dow-lbd)*24)) 
    else 
     return $(((dow-lbd+7)*24)) 
    fi 
} 

# Main 

calcHoursBack $lbd 
lbd`uname -s` $? 

echo $lbd_date