我编写此代码是为了根据一天中的具体时间回显问候语,但是当我运行它时,它不会显示任何错误,但也不向命令行回显任何内容。为了尝试排除故障,我注释掉了所有内容并仅回显了时间变量,效果很好。那么,我做错了什么?!
#!/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
[...]
引入一个字符类,而不是一个整数区间。因此,[18-23]
与 相同[138-2]
, 与 相同[13]
,因为 8 和 2 之间没有任何内容。
您可以使用以下方法进行修复:
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”时——这些是无效的八进制数字。所以你必须date
给你没有前导零的小时。因此格式%_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 ...