使用测试和日期来比较当前小时 ro 范围

使用测试和日期来比较当前小时 ro 范围

我是 Gnu/Linux 和 bash 的新手,我正在尝试编写一个简单的 bash 脚本来测试是否date +%H在预定义的小时范围内,但没有成功。

例子:

hour='date +%H'
if [[ $hour -ge 12 ]] || [[ $hour -lt 19 ]]
then echo "Good afternoon!"

尝试将一行隔离到此结果会导致“预期的整数表达式”:

test $hour -ge 12

感觉我错过了一些简单的东西,要么将 $hour 作为整数返回,要么将其作为字符串处理。

编辑:这是完成的脚本,基础层面上有什么必要的改进吗?

!#/bin/bash
name=$(whoami)
hour=$(date +%H)
if [ $hour -lt 5 ] || [ $hour -ge 19 ]
then xmessage -center "Good evening $name!"
elif [ $hour -ge 5 ] && [ $hour -lt 12 ]
then xmessage -center "Good morning $name!"
else xmessage -center "Good afternoon $name!"
fi

答案1

您正在将文字字符串分配date +%H给变量hour

运行该date命令并分配输出hour使用命令替换:

hour=$(date +%H)

或者,通过最近发布的bashshell (4.2+),

printf -v hour '%(%H)T' -1

会在不使用的情况下做同样的事情date

另外,您需要fi遵循这一点if并使用&&(“和”)代替||(“或”)以获得正确的逻辑:

if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
    echo 'Good afternoon'
fi

我在这里使用标准[ ... ]测试而不是bashshell 自己的[[ ... ]]测试,以避免将值(在和测试$hour引入的算术上下文中)解释为无效八进制数(和)的问题。-ge-lt0809

如果您觉得需要使用[[ ... ]]您可以测试${hour#0}而不是未修改的值以$hour避免出现问题。的值将与删除任何单个前导${hour#0}相同。$hour0

if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
    echo 'Good afternoon'
fi

答案2

Bash 还支持((...))算术运算的语法。您的代码可以重写为:

#!/bin/bash

declare -i hour=$(date +%k)
if (( hour > 12 && hour < 19 ))
then
    printf "Good afternoon\n"
fi

该行declare -i hour=$(date +%k)指定将变量hour视为算术整数,并将当前小时 (0-23) 分配给它,不带前导零。

相关内容