테스트와 날짜를 사용하여 현재 시간 범위를 비교하세요.

테스트와 날짜를 사용하여 현재 시간 범위를 비교하세요.

저는 Gnu/Linux와 bash를 처음 접했고, 미리 정의된 시간 범위 내에 있는지 테스트하기 위해 간단한 bash 스크립트를 작성하려고 했지만 date +%H성공하지 못했습니다.

예:

hour='date +%H'
if [[ $hour -ge 12 ]] || [[ $hour -lt 19 ]]
then echo "Good afternoon!"

이에 대해 행을 분리하려고 하면 "예상 정수 표현식"이 발생합니다.

test $hour -ge 12

$hour를 정수로 반환하거나 문자열로 처리하는 등 간단한 내용이 누락된 것 같습니다.

편집: 이것은 완성된 스크립트입니다. 기본 수준에서 필요한 개선 사항이 있습니까?

!#/bin/bash
name=$(whoami)
hour=$(date +%H)
if [ $hour -lt 5 ] || [ $hour -ge 19 ]
then xmessage -center "Good evening $name!"
elif [ $hour -ge 5 ] && [ $hour -lt 12 ]
then xmessage -center "Good morning $name!"
else xmessage -center "Good afternoon $name!"
fi

답변1

date +%H변수에 리터럴 문자열을 할당하고 있습니다 hour.

이 명령을 실행 date하고 할당하십시오.산출, hour명령 대체를 사용하십시오.

hour=$(date +%H)

또는 최근 출시된 bash셸(4.2+)을 통해

printf -v hour '%(%H)T' -1

그것을 사용하지 않고도 같은 일을 할 것입니다 date.

또한 올바른 논리를 얻으려면 fi다음을 따르고 ( "or") 대신 ("and") if를 사용해야 합니다 .&&||

if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
    echo 'Good afternoon'
fi

여기서는 값이 유효하지 않은 8진수(합계)로 해석되는 문제 (및 테스트에 의해 도입된 산술 컨텍스트에서)를 피하기 위해 쉘 자체 테스트 [ ... ]가 아닌 표준 테스트를 사용하고 있습니다 .bash[[ ... ]]$hour-ge-lt0809

값을 사용해야 한다고 생각되면 문제를 피하기 위해 수정하지 않고 [[ ... ]]테스트할 수 있습니다 . 의 값은 단일 선행 을 제거하는 것과 동일합니다 .${hour#0}$hour${hour#0}$hour0

if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
    echo 'Good afternoon'
fi

답변2

((...))Bash는 산술 연산을 위한 구문 도 지원합니다 . 코드는 다음과 같이 다시 작성할 수 있습니다.

#!/bin/bash

declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
    printf "Good afternoon\n"
fi

이 줄은 declare -i hour=$(date +%k)변수가 hour산술 정수로 처리되고 현재 시간(0-23)이 앞에 0 없이 할당되도록 지정합니다.

관련 정보