저는 CentOS를 사용하고 있으며 쉘 스크립트를 작성하고 싶습니다. 그래서
날짜가 포함된 파일이 있습니다.
>
> cat VM1_EOMAP_TIME.log
07 Sep 2022 16:30
>
현재 시간 이후의 분과 파일의 날짜를 가져오고 싶습니다.
내 생각은 다음과 같습니다: ("현재 시간부터 시작하는 시대" - "이 파일의 날짜부터 시작하는 시대")/60
하지만 "현재 시대의 신기원"을 얻을 수 없습니다
> cat VM1_EOMAP_TIME.log
07 Sep 2022 16:30
> date --date='07 Sep 2022 16:30' +%s
1662568200
> date --date=$(cat VM1_EOMAP_TIME.log) +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
> date --date=`cat VM1_EOMAP_TIME.log` +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
> TTT="07 Sep 2022 16:30"
> echo $TTT
07 Sep 2022 16:30
> date --date=$TTT +%s
date: extra operand ‘2022’
Try 'date --help' for more information.
"날짜: 추가 피연산자 '2022'" 오류가 발생하는 이유는 무엇입니까?
답변1
bash가 최근인 경우 현재 시간(epoch 초)이 내장되어 있습니다.$EPOCHSECONDS
그렇지 않으면 bash의 printf는 %(fmt)T
지시문과 마법 값 "-1"을 사용하여 이를 얻을 수 있습니다:
printf -v current_epoch '%(%s)T' -1
또한 bash에는 편의 기능이 내장되어 있습니다 $(cat file)
=> $(<file)
:
log_epoch=$( date -d "$(<VM1_EOMAP_TIME.log)" "+%s" )
답변2
문제는 따옴표에 있습니다. date -u
시간대를 보상하려면 이를 사용해야 합니다 .
$ echo "07 Sep 2022 16:30" > infile
$ var="$(<infile)"
$ cat infile; echo "$var"
07 Sep 2022 16:30
07 Sep 2022 16:30
$ date -ud "$(<infile)" ; date -ud "$var" +%s
1662568200
1662568200
$ varlog=$(date -ud "$var" +%s) #capture value for later
Bash에는 다른 더 간단한 솔루션이 있습니다:
$ echo "$EPOCHSECONDS"; printf '%(%s)T' '-1'
1662582600
1662582600
$ var1="$EPOCHSECONDS"; printf -v var2 '%(%s)T' '-1'
$ echo "$var1 $var2"
1662568200 1662568200
따라서 최종 수학은 다음과 같습니다.
$ echo $((var2 - varlog))
10747
$ echo $(((var2-varlog)/60))
179
답변3
$ let diff=($(date +%s -d 'today')-$(date +%s -f VM1_EOMAP_TIME.log))/60
$ echo "$diff"