在这个bash脚本中发生了什么?

时间:2014-01-31 11:31:23

标签: linux bash shell scripting

我正在通过shell脚本阅读,我发现了这个:

rpm -q ${package} >&2 && {
log notice "Package ${package} is already installed. Great."
return 0 }

这显然已经工作很长一段时间了,但是我无法弄清楚这是什么样的语法..花括号里面的部分..你可以有这样的花括号,我从未见过像这样的bash shell脚本之前你突然使用花括号而没有任何函数名或任何东西,并且rpm -q只是隐式地是if语句。

我理解它的作用,它相当明显,因为bash非常简单,但它的语法却让我感到高兴。

这是该函数的代码:

434 yum_install() {
435   [[ $# -lt 1 ]] && die "not enough parameters"
436   local package="${1}"
437
438   log info "Verifying package ${package} with rpm"
439   if test -z "${package}"; then
440     die "no package name provided to yum_install"
441   fi
442
443   # Return if package is already installed
444   rpm -q ${package} >&2 && {
445     log notice "Package ${package} is already installed. Great."
446     return 0
447   }
448
449   die "Package ${package} required. Please install."
450 }

1 个答案:

答案 0 :(得分:0)

{}之间的代码是代码块。仅当rpm命令成功时才会执行。这是因为两个命令都与AND运算符&&

连接在一起

虽然()之间的代码块启动子shell,但大括号之间的代码块不会启动子shell。您可以关注this guide

但是,在您发布命令的形式中,它将导致语法错误:

can only `return' from a function or sourced script

更新您在评论中告诉该代码段是函数的一部分。如果函数的一部分return 0没问题。