我正在尝试自动化我们的应用程序备份。部分过程是在egrep
语句中检查if
的退出状态:
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
[ egrep -i -q "error|warning|fatal|missing|critical" "$File" ]
then
echo "testing"
fi
我希望它输出testing
,因为该文件存在且egrep
返回成功,但我收到了错误:
-bash: [: too many arguments
我尝试了各种语法 - 附加括号,引号等,但错误仍然存在。
请帮助我理解我出错的地方。
答案 0 :(得分:7)
您犯了一个常见错误,即假设[
是if
语句语法的一部分。它不是; if
的语法只是
if command; then
... things which should happen if command's result code was 0
else
... things which should happen otherwise
fi
我们使用的常见command
之一是[
,它是命令test
的别名。这是一个比较字符串,数字和文件的简单命令。它接受一个相当狭窄的参数组合,如果你没有传递预期的参数,往往会产生令人困惑和误导性的错误消息。 (或者更确切地说,一旦你习惯了它,错误信息就足够了,但如果不使用它们很容易被误解。)
在这里,您要检查命令egrep
的结果:
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
egrep -i -q "error|warning|fatal|missing|critical" "$File"
then
echo "testing"
fi
在一般情况下,command
可以是管道或命令列表;然后,最终命令的退出代码是if
将检查的状态,类似于脚本中的最后一个命令如何决定脚本的退出状态。
这些复合命令可以任意复杂,如
if read thing
case $thing in
'' | 'quit') false;;
*) true;;
esac
then ...
但实际上,你很少在if
语句中看到多个命令(尽管它并非闻所未闻;你的||
复合语句就是一个很好的例子!)
test
作为一般厨房的历史原因,作者不想参与if
的语法,这是原始Bourne shell的一个不太吸引人的设计。 Bash和zsh
提供了不那么笨重的替代方案(比如bash中的[[
双括号),当然,POSIX test
比Bell的原始创作更加温和。实验室。
答案 1 :(得分:-4)
这样做:将你的egrep放入“$()”,删除-q并进行字符串比较:
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
[ "$(egrep -i 'error|warning|fatal|missing|critical' $File)" != "" ];
then
echo "testing";
fi