在shell ksh脚本中计算前一个工作日的最优雅方法是什么?
我到现在所拥有的是:
#!/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
Run Code Online (Sandbox Code Playgroud)
如何将$ {DAY_DIFF}变量作为值而不是字符串传输?
好吧,如果运行 Perl 算作脚本的一部分,那么就用 Perl 开发答案。下一个问题是 - 什么定义了工作日?您是周日营业的商店吗?周六?或者周一至周五朝九晚五的工作?假期呢?
假设您认为周一到周五和假期暂时无关紧要,那么您可以使用 Perl 中的算法,该算法指出周日的 wday 为 0 到周六的 6,因此如果 wday 为 1,则需要减去 3 * 86400从时间(); 如果wday为0,则需要减去2 * 86400;如果 wday 是 6,您需要减去 1 * 86400。这就是您在 Korn shell 中得到的 - 只需在 Perl 中执行即可:
#!/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));
Run Code Online (Sandbox Code Playgroud)
这确实假设您有 POSIX 模块;如果没有,那么您需要执行与您使用的大致相同的 printf() 操作。我还根据偏好使用 ISO 8601 格式作为日期(XSD 和 SQL 也使用) - 因此是图示的格式。