我正在编写一个 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,它缺少尾随],因此出现错误。
也可以看看:
test和[。man test和/或man [为您提供外部 test和[命令的手册。大多数 shell 内置了这些命令,但语义应该是相同的,尽管某些特定的测试运算符可能有所不同(可能实现了非标准运算符)。help [, help test, and help [[in a bashshell 将显示这些在bashshell中的内置命令的简短描述。有关bashshell 内置函数的更多信息,请参阅bash手册 ( man bash)。