在 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
。
归档时间: |
|
查看次数: |
215 次 |
最近记录: |