bash 找不到右括号?

sym*_*ean 1 bash test syntax

我正在编写一个 bash 脚本来在 Synology 机器上构建 MariaDB 实例。当我运行它时,它可以工作,但出现错误:

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ ./mysql_backup
./mysql_backup: line 7: [: missing `]'

admin@synology:/volume1/@appstore/MariaDB10/usr/local/bip$ head -10 mysql_backup
#!/bin/bash

DBBACKUP=/volume1/remotebackup/mnt/devmysql.sql.gz
ERRFILE=/volume1/remotebackup/mnt/devmysqlerr.log


if [ -f "${DBBACKUP}.prev" && ! -f "${ERRFILE}" ] ; then
        rm -f "${DBBACKUP}.prev"
        mv "${DBBACKUP}" "${DBBACKUP}.prev"
fi
Run Code Online (Sandbox Code Playgroud)

添加一个空格和第二个关闭']',我仍然得到同样的错误。嵌套 'if' 语句提供了一个解决方案,但令我烦恼的是有些事情并不像我预期的那样。

Kus*_*nda 15

两个标准测试&&之间的语法是

[ expression_1 ] && [ expression_2 ]
Run Code Online (Sandbox Code Playgroud)

或者,使用过时的-a选项(不要这样做),

[ expression_1 -a expression_2 ]
Run Code Online (Sandbox Code Playgroud)

例如,在您的情况下,

if [   -f "$DBBACKUP.prev" ] &&
   [ ! -f "$ERRFILE"       ]
then
    mv "$DBBACKUP" "$DBBACKUP.prev"
fi
Run Code Online (Sandbox Code Playgroud)

使用bash,您可以&&像以前一样使用,但仅限于非标准[[ ... ]]测试:

[[ expression_1 && expression_2 ]]
Run Code Online (Sandbox Code Playgroud)

也可以写成

[[ expression_1 ]] && [[ expression_2 ]]
Run Code Online (Sandbox Code Playgroud)

除了在 special 中[[ ... ]],the&&是一个 shell 操作符,用于分隔两个命令,只有在第一个成功时才会执行第二个。所以,给定命令:

[ expression_1 && expression_2 ]
Run Code Online (Sandbox Code Playgroud)

shell 运行 first [ expression_1,它缺少尾随],因此出现错误。

也可以看看:

  • 该POSIX规范test和[。
  • man test和/或man [为您提供外部 test和[命令的手册。大多数 shell 内置了这些命令,但语义应该是相同的,尽管某些特定的测试运算符可能有所不同(可能实现了非标准运算符)。
  • help [, help test, and help [[in a bashshell 将显示这些在bashshell中的内置命令的简短描述。有关bashshell 内置函数的更多信息,请参阅bash手册 ( man bash)。