FuzzyTime()
{
local tmp=$( date +%H )
case $((10#$tmp)) in
[00-05] )
wtstr="why don't you go to bed"
;;
[06-09] )
wtstr="I see your very eager to start the day"
;;
[10-12] )
wtstr="and a very good day too you"
;;
[13-18] )
wtstr="Good Afternoon"
;;
[19-21] )
wtstr="Good Evening"
;;
[22-23] )
wtstr="it is getting late, it's time to party or go to bed"
;;
*)
wtstr="guess the planet your on has more than a 24 hour rotation"
echo 'case value is:' $tmp
;;
esac
}
케이스 변수는 24시간 기준으로 시간을 나타내지만 숫자 08과 17은 문제를 일으키는 것 같습니다. 08을 사용하여 문제를 해결했는데 $((10#$tmp))
이제 17이 문제가 됩니까? 이것은 내 첫 번째 bash 스크립트입니다. 어리석은 질문이라면 미리 죄송합니다.
답변1
[]
문자 범위를 나타냅니다. [10-12] 숫자 1 2와 숫자 0-1 사이의 범위를 나타냅니다. 이는 범위의 단일 숫자와 일치합니다 0-2
.
단순 비교 사용 if-elif-else-fi
:
if [ "$tmp" -ge 0 ] && [ "$tmp" -le 5 ]; then
echo "<0,5>"
elif [ "$tmp" -ge 6 ] && [ "$tmp" -le 9 ]; then
echo "<6,9>"
#...
else
#...
fi
(또는 각 간격을 원할 경우 일련의 범위 제한을 반복할 수 있지만 이 경우 원하는 대로 하드코딩할 수도 있습니다.)
편집: 요청한 어레이 버전:
FuzzyTime(){
local needle=$1 #needle is $1
: ${needle:=$( date +%H )} #if no needle is empty, set it to "$(date +%H)
local times=( 0 6 10 13 19 22 24 0 )
local strings=(
"why don't you go to bed"
"I see your very eager to start the day"
"and a very good day too you"
"Good Afternoon"
"Good Evening"
"it is getting late, it's time to party or go to bed"
"guess the planet your on has more than a 24 hour rotation"
)
local b=0
# length(times) - 2 == index of the penultimate element
local B="$((${#times[@]}-2))"
for((; b<B; b++)); do
if ((needle >= times[b] && needle < times[b+1])); then break; fi
done
echo "${strings[$b]}"
}
FuzzyTime "$1"
시험:
$ for t in {0..27}; do FuzzyTime "$t"; done
0 -- why don't you go to bed
1 -- why don't you go to bed
2 -- why don't you go to bed
3 -- why don't you go to bed
4 -- why don't you go to bed
5 -- why don't you go to bed
6 -- I see your very eager to start the day
7 -- I see your very eager to start the day
8 -- I see your very eager to start the day
9 -- I see your very eager to start the day
10 -- and a very good day too you
11 -- and a very good day too you
12 -- and a very good day too you
13 -- Good Afternoon
14 -- Good Afternoon
15 -- Good Afternoon
16 -- Good Afternoon
17 -- Good Afternoon
18 -- Good Afternoon
19 -- Good Evening
20 -- Good Evening
21 -- Good Evening
22 -- it is getting late, it's time to party or go to bed
23 -- it is getting late, it's time to party or go to bed
24 -- guess the planet your on has more than a 24 hour rotation
25 -- guess the planet your on has more than a 24 hour rotation
26 -- guess the planet your on has more than a 24 hour rotation
27 -- guess the planet your on has more than a 24 hour rotation
답변2
[root@localhost ~]# FuzzyTime
-bash: ((: 09: value too great for base (error token is "09")
-bash: ((: 09: value too great for base (error token is "09")
-bash: ((: 09: value too great for base (error token is "09")
-bash: ((: 09: value too great for base (error token is "09")
-bash: ((: 09: value too great for base (error token is "09")
-bash: ((: 09: value too great for base (error token is "09"
guess the planet your on has more than a 24 hour rotation
[root@localhost ~]# FuzzyTime 9
I see your very eager to start the day
임시 해결책은 다음과 같습니다.
user=$( whoami )
ltime=$( date +%H%M )
new=$(echo $( date +%H ) | sed 's/^0*//')
outputFT=$(FuzzyTime $new)
echo 'Hello '$user 'its' $ltime 'hours,' $outputFT
# echo 'Hello '$user 'its' $ltime 'hours,' $FuzzyTime
제 질문은 BASH 시스템이 선호하는 형식으로 시간을 자동으로 입력하는 방법에 관한 것 같습니다. 숫자를 입력하면 위의 오류 0-9가 표시되는 것 같습니다. (여전히 배열 솔루션이 정말 마음에 듭니다).
답변3
bash/dash/ksh/zsh 등은 경로 이름 확장 또는 파일 이름 globbing과 동일한 패턴 일치 규칙을 사용하므로 case
쉘은 이러한 패턴을 범위로 해석합니다(해당 범위는 작동하지도 않습니다).
case
또한 별도의 여러 패턴을 사용할 수 있습니다 |
.
귀하의 경우에는 0[0-5])
, 등 0[6-9])
의 패턴 일치를 사용해 보십시오 1[0-2])
.
예를 들어:
case $((10#$tmp)) in
0[0-5]) wtstr="why don't you go to bed" ;;
0[6-9]) wtstr="I see you're very eager to start the day" ;;
1[0-2]) wtstr="and a very good day too you" ;;
1[3-8]) wtstr="Good Afternoon" ;;
19|2[01]) wtstr="Good Evening" ;;
2[23]) wtstr="it is getting late, it's time to party or go to bed" ;;
*) wtstr="guess the planet your on has more than a 24 hour rotation"
echo 'case value is:' $tmp
;;
esac