Case 문이 있는 bash 스크립트가 출력을 반환하지 않습니다.

Case 문이 있는 bash 스크립트가 출력을 반환하지 않습니다.

특정 시간을 기준으로 인사말을 에코하기 위해 이 코드를 작성했지만 실행하면 오류가 표시되지 않지만 명령줄에도 아무 것도 에코되지 않습니다. 문제를 해결하기 위해 모든 내용을 주석 처리하고 시간 변수만 반영했는데, 정말 잘 작동했습니다. 그럼 내가 뭘 잘못하고 있는 걸까요? !

#!/bin/bash


time=$(date +%H)

case $time in
#check if its morning
    [0-11] ) echo "greeting 1";;

#check if its afternoon
    [12-17] ) echo "greeting 2";;

#check if its evening
    [18-23] ) echo "greeting 3"
esac

답변1

[...]정수 범위 대신 문자 클래스를 도입합니다. 8과 2 사이에 아무 것도 없기 때문에 와 [18-23]동일합니다 .[138-2][13]

다음 방법을 사용하여 문제를 해결할 수 있습니다.

case $time in
#check if its morning
    0?|1[01] ) echo "greeting 1";;

#check if its afternoon
    1[2-7] ) echo "greeting 2";;

#check if its evening
    1[89]|2? ) echo "greeting 3"
esac

답변2

패턴 일치 대신 bash 산술 평가를 사용합니다.

hour=$(date +%_H)
if   ((  0 <= hour && hour <= 11 )); then echo 1
elif (( 12 <= hour && hour <= 17 )); then echo 2
else echo 3
fi

주의해야 할 유일한 것은 시간이 "08" 또는 "09"일 때입니다. 이는 유효하지 않은 8진수입니다. 따라서 date앞에 0을 붙이지 않고 시간을 주어야 합니다 . 따라서 형식%_H

답변3

[]숫자 범위를 사용하지 않고 문자 범위를 사용합니다. 당신이 가지고 있는 것은 문자 "0" 또는 "1", 문자 "1"과 "7", 문자 "1"과 "3"과 일치하는 것입니다. (Bash는 잘못된 범위 2-1과 8-2를 완전히 무시합니다. 이는 증가하지 않기 때문에 잘못된 것입니다.) 또한 이와 같은 논리적 오류를 포착하려면 Final ;;및 a가 필요합니다. 이를 위해 일련의 설명을 사용하는 *)것이 좋습니다 .if

if [ "$time" -ge 0 ] && [ "$time" -le 11 ]; then
    echo Greeting 1
elif [ "$time" -ge 12 ] && [ "$time" -le 17]; then ...

관련 정보