셸 은 두 날짜 범위 내의 모든 날 짜 를 옮 겨 다 니 며 출력 하 는 방법

머리말
평소 c/c+개발 에 서 는 날짜 처리 상황 이 자주 발생 합 니 다.예 를 들 어 주어진 날짜 사이 의 차 이 를 구 하거나 맵 으로 두 개의 고정 날짜 범위 내의 모든 날 짜 를 저장 해 야 합 니 다.이전 프로젝트 에 서 는 주어진 두 날짜 범위 내 모든 날짜 에 발생 하 는 로 그 를 셸 스 크 립 트 로 일괄 처리 해 야 했 습 니 다.그 때 는 셸 처리 가 불편 하 다 고 생각 하여 c++로 처리 하 였 습 니 다.뒤 에는 셸 로 이 루어 졌 고 발견 도 간단 했다.

사고의 흐름
      1.이 두 날 짜 를 정수 로 상쇄 하여 차 이 를 얻 은 다음 에 초기 날 짜 를 1 로 계속 누적 하여 모든 날 짜 를 얻 을 수 없고 크 고 작은 달의 문 제 를 고려 해 야 한다.
      2.향후 개발 의 편 의 를 위해 서 는 상기 범위 내 에 있 는 모든 날짜 기능 을 하나의 함수(즉,아래 스 크 립 트 의 genAlldate)에 밀봉 해 야 합 니 다.
그러나 셸 의 function 은 C/C++처럼 데이터 형식 을 반환 할 수 없고 인용 이나 포인터 기능 도 없 기 때문에 배열 변 수 를 먼저 밝 혀 야 합 니 다 DATEARRAY 는 계 산 된 모든 날 짜 를 저장 한 다음 함수 달력 에 날짜 마다 데 이 터 를 직접 기록 하 는 데 사 용 됩 니 다.
      3.마지막 으로 3 가지 방법 으로 출력 배열 DATE 를 옮 겨 다 녔 습 니 다.ARRAY 가 저장 한 모든 날짜.
      4.출력의 날짜 형식 은 가능 한 한 사용자 정의 할 수 있 습 니 다.예 를 들 어 2017-03-30,2017.06.18 과 20170618 등 입 니 다.
셸 프로그램

#!/bin/bash
# FileName: alldateduringtwodays1.sh
# Description: Print all the date during the two days you inpute.
# Simple Usage: ./alldateduringtwodays1.sh 2017-04-01 2017-06-14 or ./alldateduringtwodays1.sh 20170401 20170614 [-]
# (c) 2017.6.15 vfhky https://typecodes.com/linux/alldateduringtwodays1.html
# https://github.com/vfhky/shell-tools/blob/master/datehandle/alldateduringtwodays1.sh


if [[ $# -le 2 || $# -gt 3 ]]; then
 echo "Usage: $0 2017-04-01 2017-06-14 [-] or $0 20170401 20170614 [-] ."
 exit 1
fi

START_DAY=$(date -d "$1" +%s)
END_DAY=$(date -d "$2" +%s)
# The spliter bettwen year, month and day.
SPLITER=${3}


# Declare an array to store all the date during the two days you inpute.
declare -a DATE_ARRAY


function genAlldate
{
 if [[ $# -ne 3 ]]; then
 echo "Usage: genAlldate 2017-04-01 2017-06-14 [-] or genAlldate 20170401 20170614 [-] ."
 exit 1
 fi

 START_DAY_TMP=${1}
 END_DAY_TMP=${2}
 SPLITER_TMP=${3}
 I_DATE_ARRAY_INDX=0

 # while [[ "${START_DAY}" -le "${END_DAY}" ]]; do
 while (( "${START_DAY_TMP}" <= "${END_DAY_TMP}" )); do
 cur_day=$(date -d @${START_DAY_TMP} +"%Y${SPLITER_TMP}%m${SPLITER_TMP}%d")
 DATE_ARRAY[${I_DATE_ARRAY_INDX}]=${cur_day}

 # We should use START_DAY_TMP other ${START_DAY_TMP} here.
 START_DAY_TMP=$((${START_DAY_TMP}+86400))
 ((I_DATE_ARRAY_INDX++))

 #sleep 1
 done
}

# Call the funciotn to generate date during the two days you inpute.
genAlldate "${START_DAY}" "${END_DAY}" "${SPLITER}"


# [Method 1] Traverse the array.
echo -e "[Method 1] Traverse the array."
for SINGLE_DAY in ${DATE_ARRAY[@]};
do
 echo ${SINGLE_DAY}
done


# [Method 2] Traverse the array.
echo -e "
[Method 2] Traverse the array." for i in "${!DATE_ARRAY[@]}"; do printf "%s\t%s
" "$i" "${DATE_ARRAY[$i]}" done # [Method 3] Traverse the array. echo -e "
[Method 3] Traverse the array." i=0 while [ $i -lt ${#DATE_ARRAY[@]} ] do echo ${DATE_ARRAY[$i]} let i++ done # If you do not need this array any more, you can unset it. # unset DATE_ARRAY exit 0
테스트
이 셸 스 크 립 트 가 지원 하 는 입력 날짜 형식 은 2017-04-01 과 20170401 두 가지 입 니 다.출력 날짜 형식 은 유연 합 니 다.프로그램 을 실행 할 때 임의의 날짜 구분자(예 를 들 어 흔히 볼 수 있 는...-등)를 추가 하면 됩 니 다.마지막 으로 스 크 립 트 의 SPLITER 변수 로 형식 을 제어 합 니 다.
여기 서 사용 합 니 다./alldateduringtodays 1.sh 2017-03-30 2017-04-02.테스트 를 진행 합 니 다.효 과 는 다음 그림 과 같 습 니 다.

4.스 크 립 트 관리
현재 이 스 크 립 트 를 Github 에 두 었 습 니 다.주 소 는https://github.com/vfhky/shell-tools로 컬 다운로드입 니 다.앞으로 스 크 립 트 의 업데이트 나 더 좋 은 스 크 립 트 도 이 프로젝트 에 추 가 됩 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기