在 Bash 中处理日期

在 Bash 中处理日期

在 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用双引号括起来。

相关内容