【问题标题】:Function return values within BASH if statementsBASH if 语句中的函数返回值
【发布时间】:2017-10-11 17:19:11
【问题描述】:

我已经查看了在 BASH if-then 语句中处理函数返回值的各种方法,但似乎都没有。这是我所拥有的

 function is_cloned()
 {
      if [ -d $DIR_NAME ]
      then
           return $SUCCESS
      fi
      return $FAILURE
 }

如果我自己调用它并检查返回值,它将起作用:

 is_cloned
 retval=$?
 if [ $retval -eq $FAILURE ] 
 then
      ...
 fi

如何在 if 语句中使用函数调用?或者根本没有办法利用返回值?

【问题讨论】:

  • if 总是检查命令的返回值。注意[ 一个命令。试试help [ 看看。除了[,您还可以使用任何命令或函数,如下所示:if my_cmd ; then do this ; else do that ;
  • 除非您有一些非常具体的 SUCCESSFAILURE 值来代替 01,否则请使用 is_cloned () { [ -d "$DIR_NAME" ]; }

标签: linux bash shell sh


【解决方案1】:

if Bash 中的语句可以直接使用函数的退出代码。 所以你可以这样写:

if is_cloned
then
    echo success
fi

如果您想检查失败,就像您发布的代码一样,您可以使用! 运算符:

if ! is_cloned
then
    echo failure
fi

顺便说一句,您的 is_cloned 函数也可以更多地依赖退出代码, 你可以这样写:

is_cloned() {
    [ -d "$DIR_NAME" ]
}

这是可行的,因为函数的退出代码是最后执行的命令的退出代码, 如果成功,则[ ... ] 的退出代码为 0,否则为非零(= 失败)。

还记得将用作命令参数的变量名用双引号括起来, 就像我在这里 DIR_NAME 所做的那样。

【讨论】:

  • 有点失败的功能,还不如直接测试DIR_NAME。
  • @123 简单不代表没用。该函数封装了特定的逻辑。如果后面需要改进逻辑,可以只修改函数,剩下的程序不用管。
  • @janos 封装会不必要地增加代码复杂度。
  • @123, ...可以肯定的是,这里有一个判断电话。 然而,如果is_cloned 让读者更清楚语句背后的意图是什么,而不是从上下文中得到的意图,这本身就是增加价值。 (无论该值是否足够......再次,我们处于依赖于上下文的判断调用领域)
  • @123 在阅读主程序时,我绝对更喜欢阅读if is_cloned 而不是if [ -d DIR_NAME ]。如果我对代码不熟悉,则更容易了解代码在做什么,此外,它无需注释即可自我解释。如果我对程序如何决定是否克隆 something 感兴趣,我只需要查看函数的实现即可。老实说,除了一些琐碎的 shell 脚本之外,几乎没有理由不封装is_cloned(例如)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多