2016-07-27 11 views
0

나는 $days에서 $date의 형식으로 yyyy-MM-dd으로 subtrac을 시도해 왔지만 Solaris 11에서는 아무 것도 작동하지 않았습니다. 일부 솔루션은 시간대와 '트릭'이지만 시간대에 따라 다르며 정확하게 생각합니다. 그건 속임수 야.Solaris 11의 bash 쉘에서 날짜를 빼는 방법은 무엇입니까?

date=2000-12-31 
days=1 
julian=$(toJulian $date) 
resultJulian=$(subtractDays $julian $days) 
resultGregorian=toGregorian $resultJulian 
: 내가 생각할 수있는 유일한 것은, 예를 들어, 줄리안 표현으로 날짜를 변환 어느 날 빼고 다시 YYYY-MM-DD 표현을 얻을 수 있기 때문에

나는, 저렴한 솔루션을 싶습니다

그럼,이 모든 과정없이 어떻게해야합니까? 감사. 당신은 GNU 날짜 또는 GNU AWK이없는 경우

+0

중요한 것은 실제로 bash라는 것이 아니라 사용할 수있는'date' 버전입니다. 일부 Solaris 시스템은 기본 PATH에 없더라도 GNU 도구를 설치합니다. –

+0

시스템에 GNU core-utils 패키지가 설치되어 있지 않으면이 방법이 유용 할 것입니다. 흠 .. 그냥 p 코드를 보여 주므로 "함수"를 실제로 호출하지 않을 것이고, 당신은 특별한 args를 date에 제출할 것입니다.1970 년 이후 몇 가지'-s' 값으로 변환하고, 그 값에서 24 * 60 * 60 초를 뺍니다. GNU util을 가지고 있다면, 날짜 - 수학 능력을 확장 한'date' cmd가 별도로 있어야합니다. 나는 또한 gawk의 최신 버전이 데이트 수학을 할 수 있다고 생각하지만 확실히 알아 내기 위해서는'man gawk'을해야 할 것이다. – shellter

+0

사실'resultGregorian = toGregorian $ resultJulian'은 '$ resultJulian'이 명령으로 확장되고'resultGregorian'이 환경에서 일시적으로'toGregorian'으로 설정되어 실행됩니다. 확실히 그것은 당신이 원하는 것이 아닙니다. –

답변

2

, perl 고려 :

subtractDays() { 
    local date numDays 
    date=$1 
    numDays=$2 

    date=$date days=$numDays perl -e ' 
    use Env qw(date days); 
    use Time::Piece; 
    use Time::Seconds; 

    my $start_time = Time::Piece->strptime($date, "%Y-%m-%d"); 
    my $end_time = $start_time - (ONE_DAY * $days); 
    print $end_time->ymd . "\n";' 
} 

... 그 이후 :

subtractDays 2000-12-31 1 

... 방출 ...

2000-12-30 
+0

고맙습니다. GNU date와 GNU awk가 설치되지 않았기 때문에 Solaris 고객도 가지고 있지 않다고 생각합니다. Perl에 관해서, 예, 저는 Perl을 가지고 있지만, perl이 Solaris의 클린/디폴트 설치에 포함되도록 할 수 있습니까? 나는 그것을 위해 seraching하고있다. – SerchRac

+0

나는 그것이 확실하다고 확신한다. 그리고 그렇지 않다면 C에서 방금 한 일을하는 프로그램을 컴파일 할 수 없다면 날짜 계산을위한 도구 없이도 막혀있을 것입니다. –

+0

Ok, done !, 나는 Perl이 최소한 Solaris 11에 미리 설치되어 있다는 것을 알아 낸다. 나에게 충분하다. 그건 그렇고, 당신의 예제에서,'subtractDays 2000-12-31 1'은'2000-12-30'을 방출합니다. – SerchRac

1

다음은 Solaris 11 용 솔루션입니다.

#!/bin/bash 
mydate="2016-08-01" 
days=3 
date_in_the_past=$(gdate -d "${mydate} - ${days} days") 

사용할 수 없다고 말할 때 gdate을 사용하는 이유가 궁금 할 수 있습니다.

실제로 GNU Date는 Solaris 11 설치시 실제로 기본적으로 사용 가능합니다. gdate 명령 (전체 경로는 /usr/bin/gdate)으로 액세스 할 수 있습니다.

일부 배경 : GNU Date는 "GNU Coreutils"패키지의 일부이며이 패키지는 고객이 적극적으로 제외하지 않는 한 모든 Solaris 11 서버에 설치됩니다. 나는 그것이 사실이라고 의심한다.

그래서 gdate은 어딘가에 있지만 찾을 수 없다고 말했습니까? 이유는 아마도 사용자가 전역 영역이 아닌 로컬 영역에있는 것입니다. 이 특정 패키지는 기본적으로 생성 될 때 로컬 영역으로 전파되지 않습니다. 이 작업은 디스크 공간을 절약하기 위해 (나에게 묻는다면 잘못 인도 됨) 이루어집니다. 전역 영역과 로컬 영역의 차이점은 많은 솔라리스 관리자들에게는 다소 알려져 있지 않습니다.

pkg install file/gnu-coreutils 
: 로컬 영역에서

:

에서는 Solaris 설명

는 갑자기 그들이 필요한 명령을 실행하기에 더 허용됩니다 사실 바이너리가 이미 물리적으로 디스크에 상주한다는 버전 관리자

위의 명령은 실제로 서버 외부로 나오지 않습니다. 원격 패키지 저장소에서 패키지를 가져 오지 않습니다. 패키지가 이미 디스크에 있기 때문에 서버가 네트워크에서 분리 될 때 명령을 실행하더라도 명령이 작동합니다. 일단 당신이 솔라리스 관리자에게 명령을 실행하는 것으로 괜찮다고 설명하면.

+0

참고로, POSIX 표준은 모든 대문자 이름의 네임 스페이스가 환경 변수에 의해 시스템 또는 쉘에 의미가 사용되도록 명시 적으로 지정하고 응용 프로그램 사용을 위해 적어도 하나의 소문자가있는 변수의 네임 스페이스를 따로 설정합니다. http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html의 네 번째 단락을 참조하십시오 (셸 변수 할당은 이름이 비슷한 환경 변수를 암시 적으로 덮어 씀 때문에 규칙이 반드시 해당 규칙에도 적용된다는 것을 명심하십시오). –

+0

... OS 관련 지침에 대해서는 bravo (및 +1)라고합니다. –

+0

@CharlesDuffy. 좋은 지적. 예제를 소문자 바를 사용하도록 변경했습니다. – peterh