shell 备份脚本,缺少`]`

a c*_*der 4 shell shell-script control-flow

我正在整理一个简单的备份脚本,该脚本将压缩文件夹的内容,然后将该文件移动到备份服务器。该脚本确保 tar 文件存在并且在移动之前不是零字节。

问题是脚本在其中一条 IF 行上死掉了

if [ -f /www/archives/pdf/pdf_201207021048.tar && 11294720 -gt 0 ]; then
    echo "tar file exists and is greater than 0 bytes."
else
    echo "tar file does not exist or is zero bytes"
fi
Run Code Online (Sandbox Code Playgroud)

控制台中的错误是:

./backup_pdf.sh: line 49: [: missing `]'
Run Code Online (Sandbox Code Playgroud)

第 49 行是上面的 if 语句。

该脚本已成功验证

sh -n backup.sh
Run Code Online (Sandbox Code Playgroud)

sh看到丢失的“]”有什么问题,但它通过了语法检查?

Sha*_*off 9

问题是它&&不是 的有效运算符[。它需要-a代替,或[ condition ] && [ other_condition ].

&&是posix shell 中的分隔符(原样;, ||,&\n)。它看到语句[ -f www/archives/pdf/pdf_201207021048.tar;语句结束是因为有一个&&,然后还有另一个语句(如果到达它也会导致错误),看起来像11294720 -gt 0 ],并且该语句以;.

  • 我唯一能想到的是 `[` 不是 shell 语法的一部分,它实际上是一个程序调用(尽管它通常是一个内置于 shell 的程序)。我可以想象`-n` 不会对正确的命令调用提供任何保证。 (2认同)