요일을 기준으로 If-Else 쿼리를 사용하려면 어떻게합니까?


10

문제점 : 오늘이 목요일인지 확인하고이 조건의 결과에 따라 다른 조치를 수행해야합니다. 나는 두 가지 다른 접근법을 시도했다.

요일 이름 얻기 :

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

날 숫자 얻기 :

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

두 경우 모두 YES 여야하지만 출력은 NO입니다. 뭐가 잘못 되었 니?


1
참고 사항 : 과 같은 줄에있는 ;경우 필요합니다 . 이 경우 중복됩니다. thenif
manatwork

답변:


12

문제는 빈칸이없는 것입니다.

다음 코드는 [내장 명령이 ==에 대한 별명으로 허용 되는 쉘에서 작동 합니다 =.

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

그러나 마음 (참조 유지 help testbash) :

  • ==공식적으로 언급되지 않은 =경우 문자열 비교에 사용해야 합니다
  • -eq소수점 연산 테스트를위한 것입니다 (여기 차이를하지 않습니다 date +%u하지만 것에 대한 date +%d예를 들어 것은이 비교에 올 때 044수치 적으로 동일하지만, 어휘 적 차이가 있음).

내가 선호하는:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

일반적으로 요일 번호 접근 방식을 선호해야합니다 . 현재 로케일 에 대한 종속성이 적기 때문 입니다. 내 시스템에서 출력 date +"%a"은 오늘 Do입니다.


3

case이런 종류의 일을하는 더 좋은 방법을 간과하지 마십시오 .

또한 date +%a로케일에 따라 출력이 달라 지므로 영어 이름이 필요한 경우 프랑스어 또는 한국어 사용자가 호출 할 때 스크립트 작동이 중지됩니다.

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

위의 $(...)인용문을 인용 할 필요가없는 드문 경우 중 하나입니다 (인용문은 해를 끼치 지 않습니다.에서와 동일 var="$(...)").


0

같은 생각으로, 나는 선택된 시간 전에 cron을 "비활성화"하기 위해 다음 코드를 사용합니다.
물론, crontab 자체를 수정하려고합니다 ...

우리가 밤에 있지 않으면 bash 스크립트를 중단시키는 간단한 테스트가 있습니다.

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here

/usr/bin/test쉘의 내장 [명령 대신 왜 사용 합니까?
Stéphane Chazelas

@ Stéphane Chazelas 나는 crontab에 액세스 할 수 없기 때문에 3,4,5,6을 사용하지 않았습니다. ( 이것은 내 게시물의 두 번째 줄입니다.) 우리 서버는 Claranet에 의해 관리되며 우리는 이미 일주일의 티켓 탁구를 잃어 버렸습니다. 따라서 다음과 같이 할 수있을 때 티켓을 엉망으로 만들거나 다시 열지 않습니다. 이러한 이유로 매일 대신 시간당 크론 작업을 요청했으며 모든 테스트가 완료 될 때까지 작업을 건드리지 않는 것이 더 쉬울 것입니다. 실행 된 스크립트에 컨트롤을 추가하십시오.
Balmipour

아, 죄송합니다. 귀하는 cron사용자의 crontab과 달리 실행 파일 을 수정할 권리가 없다고 생각했습니다 .
Stéphane Chazelas

@ Stéphane Chazelas 테스트 구문에 대해서는 crontab을 사용할 있는 다른 서버에서 스크립트를 먼저 시도했기 때문에 [] 또는 [[]]보다 선호했습니다 . 크론에 대해 너무 많은 놀라움을 겪은 후 가능한 한 크론 탭에서 절대 경로를 사용하는 습관을 얻었습니다. 어쨌든 테스트를 못하고 옳다고 말할 수도 있습니다 ...하지만 쉘 테스트는 항상 어색하고 옳을 것이라고 대답 할 것입니다 ^^ 나에게 중요한 것은 주로 간단한 복사 / 붙여 넣기 및 설명이 포함되어 있습니다.
Balmipour

1
-a에서 더 이상 사용되지 않습니다 test. 일반적으로 다음을 사용합니다. hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ](또는 hour=`date +%H`현재 Bourne 쉘과 호환되어야하는 경우, Solaris 10 이상 및 현재는 드문 SCO unice 일 수 있습니다)
Stéphane Chazelas

0

요일에 스크립트를 중지하려면 다음 줄만 삭제하십시오.

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi

유닉스 SE에 오신 것을 환영합니다! 첫 줄을 올바르게 이해했는지 잘 모르겠습니다. 하지 않을까요 if [ "$DAYOFWEEK" -lt 7 ]더 나은?
peterh-복원 모니카

-1

우선 과제 DAYOFWEEK = "$ (date + % u)"를 인용해야합니다.

그리고 [와] 괄호의 양쪽에 공백이 있어야합니다.

줄 끝의 세미콜론은 중복됩니다.


1
인용은 필요하지 않습니다.
H.-Dirk Schmitt

H.-DirkSchmitt의 코멘트 @을 확장하려면 다음 이유로 필요한되지 인용하는 이유는 출력이 공백을 포함 할 것입니다.
CVn

@ MichaelKjörling : 아니오 – 그것은 결코 필요하지 않습니다 ;-) 예를보십시오 :a=$(echo 1 2 3); echo $a;
H.-Dirk Schmitt

@ H.-DirkSchmitt a=$(echo "1 2 3"); echo $a는 숫자 사이에 여러 공백이 있습니다 (StackExchange는 불행히도 간단한 복사하여 붙여 넣기 할 수 없습니다).
CVn

@ MichaelKjörling-man bash 참조 "대치가 큰 따옴표 안에 있으면 단어 분리 및 경로 이름 확장이 결과에서 수행되지 않습니다." 따라서 질문과 "1 2 3"예제의 경우에는 차이가 없습니다.
H.-Dirk Schmitt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.