带有 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

[...]引入一个字符类,而不是一个整数区间。因此,[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 ...

相关内容