【问题标题】:ksh function return value in parenthesesksh 函数返回值在括号中
【发布时间】:2012-02-11 00:08:26
【问题描述】:

在以下非常简单的 ksh 脚本示例中,我需要询问 func1 结果是否等于 4 ,

这就是我在示例中所做的,但该脚本没有像我预期的那样打印“函数结果 = 4”。

为了打印“function result = 4”,我需要在 [[......]] 中进行哪些更改

备注 - func1 必须在 [[.....]]

  #!/bin/ksh

  func1()
  {
    return 4
  }

  [[ ` func1 ` = ` echo $? `  ]]  && print "function result = 4"  

【问题讨论】:

    标签: linux bash function shell ksh


    【解决方案1】:

    你需要

    #!/bin/ksh
    
      func1()
      {
        print -- 4
      }
    
      [[ $(func1) = 4  ]]  && print "function result = 4"  
    

    #!/bin/ksh
    
      func1()
      {
        return 4
      }
    
      func1 ; [[ $? == 4 ]]  && print "function result = 4"
    

    你提供的代码中有几个问题,所以让我试着解释一下(你让它变得比需要的更复杂)。

    没有。 1 是您使用反引号进行命令替换,自 1995 年以来,这些在 ksh 语言中已被弃用!使用 $( ... cmd ) 进行现代 cmd 替换。我们经常看到将反引号列为对可移植性的认可,但只有为 Bourne shell 是唯一 shell 可用的系统编写的脚本才需要使用反引号。 (好吧,我不知道 dash 或 ash,所以也许这些也是)。

    没有 2. 那是美元吗?在执行过函数或命令或管道之后设置,并且是最后一个命令的返回码。它是一个介于 0-255 之间的值。当您有类似 cmd ; rc=$? ; echo $? 的代码时;您现在正在呼应rc=$? 的分配状态(几乎总是0),这就是为什么您会看到有经验的脚本编写者保存$?在用它做任何其他事情之前。

    回想一下,当return 设置$? 的值时,命令替换使用$( ... cmd ...) 或反引号括起来的命令的输出(直到下一个命令执行重置值)。

    我希望这会有所帮助。

    【讨论】:

    • 很好的解释@shellter。 +1
    • tnx @JaypalSingh ;在编写答案的测试中,我还偶然发现了 [[ func1 = 4 ]] 没有从函数中获取返回值的问题。我现在意识到,根据现在已删除的评论,[[ ... ]] 只会评估文本值,+ 比较操作 + 命令替换(可能还有其他),但无法直接在内部执行 func。
    • 是的,@ruakh 在我的回答中指出了这一点,我把它删除了,因为我错了。但是现在阅读您的答案和他的评论,现在更有意义了。
    • 我也为你的精彩解释点赞
    【解决方案2】:

    函数确实返回 4。运算符 ``(反引号)忽略结果值,而是返回函数的标准输出(在您的情况下为空字符串,因为 func1 没有将任何内容打印到标准输出)。

    还有

    `echo $?`
    

    只是过于复杂的说法

    $?
    

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 2020-07-08
      • 2023-03-20
      • 2012-02-22
      • 2010-09-14
      • 2011-11-25
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多