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