我正在尝试自动化我们的应用程序备份。该过程的一部分是在if语句中检查egrep的退出状态:
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我尝试了各种语法--附加括号、引号等,但错误仍然存在。
请帮助我理解我哪里错了。
发布于 2016-04-02 17:29:20
您犯了一个常见的错误,即假设[是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语句中看到超过一个命令(尽管这并非闻所未闻;使用||的复合语句就是一个很好的例子!)
只是为了说明这一点,
if [ egrep foo bar ]在arguments egrep foo bar上运行[,也就是test。但是不带选项的[只接受一个参数,然后检查该参数是否是空字符串。(egrep显然不是空字符串。这里的引用是可选的,但可能会更容易理解:
if [ "egrep" ]; then
echo "yes, 'egrep' is not equal to ''"
fi这在孤立的情况下显然是愚蠢的,但希望能作为一个说明性的例子。)
test作为一个通用的厨房水槽的历史原因是,作者不想在if的语法中加入一部分,这是原始Bourne shell的一个不太吸引人的设计。Bash和zsh提供了不那么笨重的替代方案(就像bash中的[[双括号),当然,POSIX test比贝尔实验室的原始版本要好得多。
发布于 2016-04-02 17:30:57
这是可行的:将你的egrep放入"$()“中,删除-q并进行字符串比较:
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
[ "$(egrep -i 'error|warning|fatal|missing|critical' $File)" != "" ];
then
echo "testing";
fihttps://stackoverflow.com/questions/36371221
复制相似问题