저는 스크립팅이 처음입니다. 사용자가 입력한 날짜를 기준으로 다음 날 날짜를 가져오려면 AIX 환경에서 스크립트를 작성해야 합니다.
열심히 검색한 후에 내가 달성해야 하는 것과 반대되는 코드 조각을 얻었습니다. 사용자가 날짜를 입력하기 전(어제)을 얻을 수 있습니다.
코드는 다음과 같습니다
#!/bin/ksh
echo "Enter the date (YYYY/MM/DD):"
read date
YEAR=`echo $date | cut -d"/" -f1`
MONTH=`echo $date | cut -d"/" -f2`
DAY=`echo $date | cut -d"/" -f3`
DAY=`expr "$DAY" - 1`
case "$DAY" in
0)
MONTH=`expr "$MONTH" - 1`
case "$MONTH" in
0)
MONTH=12
YEAR=`expr "$YEAR" - 1`
;;
esac
DAY=`cal $MONTH $YEAR | grep . | fmt -1 | tail -1`
esac
echo "Yesterday's Date is $YEAR/$MONTH/$DAY"
사용자가 입력한 날짜의 다음 날을 가져오는 것을 구현하는 데 도움을 줄 수 있는 사람이 있나요?
원하는 출력:
Enter the date (YYYY/MM/DD): 2013/09/30
Tomorrow's Date is 2013/10/1
답변1
비교적 새로운 버전을 사용하세요 ksh93
.
$ printf "%(%Y/%m/%d)T\n" "2014/06/20 +1 day"
2014/06/21
또는:
$ printf "%(%Y/%m/%d)T\n" "2014/06/20 next day"
2014/06/21
$ printf "%(%Y/%m/%d)T\n" "2014/06/20 tomorrow"
2014/06/21
답변2
AIX에는 기본적으로 GNU 날짜가 없습니다. Perl 버전에 따라 다음을 수행할 수 있습니다.
perl -MTime::Piece -MTime::Seconds -le '
$tomorrow = Time::Piece->strptime($ARGV[0], "%Y/%m/%d") + ONE_DAY;
print $tomorrow->ymd("/")
' 2013/10/28
그래서 ksh에서
#!/bin/ksh
read date?"Enter the date (YYYY/MM/DD): "
tomorrow=$(
perl -MTime::Piece -MTime::Seconds -le '
$tomorrow = Time::Piece->strptime($ARGV[0], "%Y/%m/%d") + ONE_DAY;
print $tomorrow->ymd("/")
' "$date"
)
echo "Tomorrow is $tomorrow"
이를 실행하면 다음과 같습니다.
Enter the date (YYYY/MM/DD): 2013/12/31
Tomorrow is 2014/01/01
이전 버전의 ksh 및 Perl에서 테스트되었습니다.
$ what /usr/bin/ksh
/usr/bin/ksh:
Version M-11/16/88i
SunOS 5.8 Generic 110662-24 Apr 2007
$ perl --version
This is perl, v5.10.0 built for sun4-solaris
답변3
Time::Local
매우 기본적이고 일반적인 모듈( 및 POSIX
) 만 사용하여 Perl 접근 방식을 사용합니다 .
#!/bin/ksh
echo "Enter the date (YYYY/MM/DD):"
read date
timestamp=`perl -MTime::Local=timelocal -e '@t = split(/[-\/]/, $ARGV[0]); $t[1]--; print timelocal(1,1,1,reverse @t);' $date`
YESTERDAY=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0] -86400));' $timestamp`
TODAY=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0]));' $timestamp`
TOMORROW=`perl -MPOSIX=strftime -e 'print strftime("%Y/%m/%d", localtime($ARGV[0] +86400));' $timestamp`
echo "YESTERDAY= $YESTERDAY"
echo "TODAY= $TODAY"
echo "TOMORROW= $TOMORROW"
예:
Enter the date (YYYY/MM/DD):
2014/02/28
YESTERDAY= 2014/02/27
TODAY= 2014/02/28
TOMORROW= 2014/03/01
해당 Time::Local
모듈이 없어도 이 작업은 여전히 더 많은 고통을 안고 수행될 수 있습니다. 그러나 POSIX
모듈( strftime
메서드)은 "지능형" 부분이기 때문에 필수입니다. 그렇지 않으면 '2월 28일'에서 '3월 1일'로 가기 어려울 것이다.
답변4
printf "Enter the date (YYYY/MM/DD):" ; read user_date
desired_date=`date --date="$user_date+1 day" +"%Y/%m/%d"`
echo "Tomorrow's Date is $desired_date"