我正在编写一个 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 abash
shell 将显示 shell 中这些内置命令的简短描述bash
。有关bash
shell 内置函数的更多信息,请参阅bash
手册 (man bash
)。