我是 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)
或者,通过最近发布的bash
shell (4.2+),
printf -v hour '%(%H)T' -1
会在不使用的情况下做同样的事情date
。
另外,您需要fi
遵循这一点if
并使用&&
(“和”)代替||
(“或”)以获得正确的逻辑:
if [ "$hour" -ge 12 ] && [ "$hour" -lt 19 ]; then
echo 'Good afternoon'
fi
我在这里使用标准[ ... ]
测试而不是bash
shell 自己的[[ ... ]]
测试,以避免将值(在和测试$hour
引入的算术上下文中)解释为无效八进制数(和)的问题。-ge
-lt
08
09
如果您觉得需要使用[[ ... ]]
您可以测试${hour#0}
而不是未修改的值以$hour
避免出现问题。的值将与删除任何单个前导${hour#0}
相同。$hour
0
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) 分配给它,不带前导零。