제2 장: Improving On User Commands - 22. 시간 대별 시간 표시

5520 단어 linuxshellbash
날짜 명령 의 가장 기본 적 인 요 구 는 시간 대의 날짜 와 시간 을 표시 하 는 것 입 니 다.하지만 시간 대 를 뛰 어 넘 는 사용자 가 있다 면?아니면 친구 나 동료 가 있 을 때 다른 지역 에 있다 면?카 사 브 란 카, 바티칸, 시드니 등 그곳 이 지금 어떤 날인 지 계속 알 수 없 을 것 이다.
   현재 대부분의 유 닉 스 시스템 에는 date 명령 이 있 습 니 다. 배경 은 시간 대 데이터베이스 입 니 다.그것 의 위 치 는 일반적으로 디 렉 터 리/usr/share/zoneinfo 아래 250 개가 넘 는 지역 을 열거 하고 각 지역 의 시간 을 명확 하 게 나 타 낼 수 있다.date 명령 은 시간 변수 TZ 를 중시 하기 때문에 이 변 수 는 서로 다른 알려 진 지역 으로 설정 할 수 있 습 니 다. 그러면 핵심 기능 은 다음 과 같 습 니 다. TZ = "Africa/Casablanca"date   셸 스 크 립 트 를 통 해 사용자 인터페이스 에 우호 적 인 시간 대 데이터 베 이 스 를 만 들 수 있 습 니 다. 대부분의 시스템 사용자 들 은 환경 변 수 를 임시로 설정 하 는 것 을 좋아 하지 않 는 다 는 것 을 알 아야 합 니 다.
코드:
#!/bin/sh
 
 # timein.sh --              .
 #           ,    UTC/GMT.
 #     "list"         
 #   :        ,         。
 
 #        : http://www.twinsun.com/tz/tz-link.htm
 
 zonedir="/usr/share/zoneinfo"
 
 if [ ! -d $zonedir ]; then
     echo "No time zone database at $zonedir." >&2
     exit 1
 fi
 
 if [ -d "$zonedir/posix" ]; then
     zonedir=$zonedir/posix  #   Linux  
 fi
 
 if [ $# -eq 0 ]; then
     timezone="UTC"
     mixedzone="UTC"
 elif [ "$1" = "list" ]; then
     (echo "All known time zones and regions defined on this system:"
     cd $zonedir
     find * -type f -print | xargs -n 2 | \
     awk '{printf "%-38s %-38s
", $1, $2}' ) | more exit 0 else region="$(dirname $1)" # Asia/Beijing, region Asia zone="$(basename $1)" # Beijing, region # ? 。 。 # 。 matchcnt="$(find $zonedir/$region -name $zone -type f -print | wc -l | sed 's/[^[:digit:]]//g')" # , $region, 。 。 # Asia/Beijing , Asia, if [ "$matchcnt" -gt 0 ]; then # if [ "$matchcnt" -gt 1 ]; then # echo "\"$zone\" matches more than one possible time zone record." >&2 echo "Please use 'list' to see all known regions and time zones." >&2 exit 1 fi match="$(find $zonedir -name $zone -type f -print)" mixedzone="$zone" else # , : region + zone mixedregion="$(echo ${region%${region#?}} | tr '[[:lower:]]' '[[:upper:]]')\ $(echo ${region#?} | tr '[[:upper:]]' '[[:lower:]]')" # mixedzone="$(echo ${zone%${zone#?}} | tr '[[:lower:]]' '[[:upper:]]')\ $(echo ${zone#?} | tr '[[:upper:]]' '[[:lower:]]')" # if [ "$mixedregion" != "." ]; then # # , ( "Atlantic") match="$(find $zonedir/$mixedregion -name $mixedzone -type f -print)" else match="$(find $zonedir -name $mixedzone -type f -print)" fi if [ -z "$match" ]; then if [ ! -z "$(find $zonedir -name $mixedzone -type d -print)" ]; then echo \ "The region \"$1\" has more than one time zone. Please use 'list'" >&2 else # echo "Can't find an exact match for \"$1\". Please use 'list'" >&2 fi echo "to see all known regions and time zones." >&2 exit 1 fi fi timezone="$match" fi nicetz=$(echo $timezone | sed "s|$zonedir/||g") echo It\'s $(TZ=$timezone date '+%A, %B %e, %Y, at %l:%M %p') in $nicetz exit 0

스 크 립 트 작업 방법:    이 스 크 립 트 는 날짜 와 시간 을 표시 하기 위해 date 명령 을 사용 합 니 다.사실 이 모든 스 크 립 트 는 당신 이 준 시간 대 이름 을 확인 해 야 스 크 립 트 의 마지막 에 예정대로 실 행 될 수 있 습 니 다.이 스 크 립 트 의 가장 복잡 한 부분 은 사용자 가 입력 한 시간 대 데이터베이스 에 있 는 이름 과 일치 하지 않 는 지역 이름 을 예측 하 는 것 입 니 다.시간 대 데이터 베 이 스 는 시간 대 이름 에 따라 지역 별로 배열 되 고 전형 적 인 입력 문제 가 있 을 때 스 크 립 트 도 유용 한 오류 정 보 를 보고 하려 고 합 니 다.    예 를 들 어 TZ = "Casablanca"는 부 드 럽 지 않 지만 일치 하 는 지역 을 성공 적 으로 찾 았 습 니 다. date 명령 은 GMT 를 보 여 줍 니 다. 도시 Casablanca 는 지역 데이터 베이스 에 존재 합 니 다.가능 한 이름, 아프리카/카 사 블 랑 카 는 이 스 크 립 트 에 제 공 됩 니 다.스 크 립 트 는 아프리카 디 렉 터 리 에 있 는 카 사 브 란 카 를 찾 아 이 지역 을 정확하게 확인 합 니 다.'Africa' 를 지정 합 니 다. 다른 한편 으로 는 스 크 립 트 가 파 티 션 이 있다 는 것 을 알 고 있 습 니 다. 그 정보 만 제공 하면 시간 대 를 지정 할 수 없습니다.마지막 으로 시간 대 이름 (예 를 들 어 UTC, WET) 을 스 크 립 트 매개 변수 로 정의 한 시간 대 부분 집합 을 볼 수 있 습 니 다.   아주 좋 은 시간 대 데이터베이스 참고 자료 온라인:http://www.twinsun.com/tz/tz-link.htm
주: UTC 는 세 계 를 조율 할 때 (Universal Time Coordinated) 영어 줄 임 말로 베 이 징 시간 은 UTC 시간 보다 8 시간 빠르다.GMT (Greenwich Mean Time) 는 그리니치 평시 다.
스 크 립 트 실행:
./timein.sh 
 It's    ,     24, 2012, at 12:19    in UTC
 
 ./timein.sh London
 It's    ,     24, 2012, at 12:19    in Europe/London
 
 ./timein.sh Brazil
 The region "Brazil" has more than one time zone. Please use 'list'
 to see all known regions and time zones.
 
 ./timein.sh Pacific/Honolulu
 It's    ,     23, 2012, at 2:21    in Pacific/Honolulu
 
 ./timein.sh WET
 It's    ,     24, 2012, at 12:21    in WET
 
 ./timein.sh mycloset
 Can't find an exact match for "mycloset". Please use 'list'
 to see all known regions and time zones.

좋은 웹페이지 즐겨찾기