在 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
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。