bash 找不到右括号?

bash 找不到右括号?

我正在编写一个 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

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

答案1

两个标准测试的语法&&

[ expression_1 ] && [ expression_2 ]

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

[ expression_1 -a expression_2 ]

以你的情况为例,

if [   -f "$DBBACKUP.prev" ] &&
   [ ! -f "$ERRFILE"       ]
then
    mv "$DBBACKUP" "$DBBACKUP.prev"
fi

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

[[ expression_1 && expression_2 ]]

也可以写成

[[ expression_1 ]] && [[ expression_2 ]]

除了特殊的 之外[[ ... ]]&&是一个 shell 操作符分隔两个命令,仅当第一个成功时才执行第二个。因此,给出命令:

[ expression_1 && expression_2 ]

shell 首先运行[ expression_1,缺少尾随的],因此出现错误。

也可以看看:

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

相关内容