我是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
发布于 2020-12-17 09:36:12
将文本字符串date +%H
分配给变量hour
。
要运行该date
命令并将其输出分配给hour
,请使用命令替换:
hour=$(date +%H)
或者,最近发布了bash
外壳(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
的值解释为无效的八进制数字(08
和09
) (在-ge
和-lt
测试引入的算术上下文中)。
如果您觉得需要使用[[ ... ]]
,您可以测试${hour#0}
而不是未经修改的$hour
值,以避免出现问题。${hour#0}
的值将与$hour
相同,但任何单个前导0
都将被删除。
if [[ ${hour#0} -ge 12 && ${hour#0} -lt 19 ]]; then
echo 'Good afternoon'
fi
发布于 2020-12-17 10:54:04
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)分配给它,没有前导零。
https://unix.stackexchange.com/questions/624977
复制