셸 은 두 날짜 범위 내의 모든 날 짜 를 옮 겨 다 니 며 출력 하 는 방법
4460 단어 shell날짜 옮 겨 다 니 기범위.
평소 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로 컬 다운로드입 니 다.앞으로 스 크 립 트 의 업데이트 나 더 좋 은 스 크 립 트 도 이 프로젝트 에 추 가 됩 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.