![在 Bash 中处理日期](https://linux22.com/image/1169070/%E5%9C%A8%20Bash%20%E4%B8%AD%E5%A4%84%E7%90%86%E6%97%A5%E6%9C%9F.png)
在 bash 脚本中,我想检查是否是该月的第一天。现在我有:
if [ $DAY -eq 1 ]; then
rclone copy /tmp/$MONTH-$YEAR.tar.gz.gpg /server2/archive
fi
我收到一个错误:
[: -eq: unary operator expected
我尝试了网络上的许多不同语法,但都无法成功。知道哪里出了问题吗?Ubuntu Server 18.04
答案1
Bash 没有预定义DAY
。作为乔斯说,您收到的错误消息与完全省略时获得的消息相同:
ek@Kip:~$ [ -eq 1 ]
-bash: [: -eq: unary operator expected
该命令date +%d
输出当前月份的日期。如果要DAY
保留该值,可以使用:
DAY="$(date +%d)"
但你也可以放置命令替换在[
命令中:
if [ "$(date +%d)" -eq 1 ]; then
rclone copy "/tmp/$MONTH-$YEAR.tar.gz.gpg" /server2/archive
fi
date +%d
总是输出两位数,因此当它是月份的第一天时,它会输出01
,但这没有问题。从算术上讲,01
等于1
,并且您正确地使用了-eq
,它执行数字比较(不同于=
,它执行文本比较)。
你会注意到我有封闭式 $(date +%d)
在双引号在[
命令中。这可以防止通配符和单词拆分。
这是个好主意总是包围参数扩展("$DAY"
),算术扩展("$((3 + 4))"
), 和命令替换("$(date +%d)"
或不太喜欢的形式`date +%d`
)双引号除非你真的想要执行的通配符和单词拆分。
如果你最初写的是"$DAY"
而不是$DAY
,那么你将会得到这个错误[
:
-bash: [: : integer expression expected
那个错误更加有意义。
我还将/tmp/$MONTH-$YEAR.tar.gz.gpg
包含参数扩展的路径$MONTH
和$YEAR
用双引号括起来。