在 bash 中处理日期

Jan*_*ski 4 bash

在 bash 脚本中,我想检查它是否是当月的第一天。我现在有:

if [ $DAY -eq 1 ]; then
        rclone copy /tmp/$MONTH-$YEAR.tar.gz.gpg /server2/archive
fi
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

[: -eq: unary operator expected
Run Code Online (Sandbox Code Playgroud)

我从网上尝试了许多不同的语法,但我无法成功。知道出了什么问题吗?Ubuntu 服务器 18.04

Eli*_*gan 7

Bash 没有预定义DAY. 正如乔斯所说,您收到的错误消息与完全省略时获得的消息相同:

ek@Kip:~$ [ -eq 1 ]
-bash: [: -eq: unary operator expected
Run Code Online (Sandbox Code Playgroud)

该命令date +%d输出当月的当前日期。如果要DAY保留该值,可以使用:

DAY="$(date +%d)"
Run Code Online (Sandbox Code Playgroud)

但是您也可以将命令替换放在[命令中:

if [ "$(date +%d)" -eq 1 ]; then
        rclone copy "/tmp/$MONTH-$YEAR.tar.gz.gpg" /server2/archive
fi
Run Code Online (Sandbox Code Playgroud)

date +%d总是输出两位数,所以当它是当月的第一天时它输出01,但这没有问题。算术上,01等于1,并且您正确地使用了-eq,它执行数字比较(与=执行文本比较的 不同)。

你会发现,我已经封闭 $(date +%d)双引号中的[命令。这可以防止通配分词

始终将参数扩展( "$DAY")、算术扩展( "$((3 + 4))") 和命令替换"$(date +%d)"或不太受欢迎的形式`date +%d`双引号是一个好主意,除非在相当罕见的情况下您实际上想要执行通配符和分词。

如果您最初编写"$DAY",而不是$DAY,那么您会从[以下位置收到此错误:

-bash: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)

这个错误更有意义。

我还用双引号/tmp/$MONTH-$YEAR.tar.gz.gpg将您的路径 , 括起来,其中包含参数扩展$MONTH$YEAR