【问题标题】:'<=' and '>=' operators do not work'<=' 和 '>=' 运算符不起作用
【发布时间】:2018-08-02 14:07:38
【问题描述】:

为了检查安装程序是否已安装,我做了:

installer status |grep Version| cut -c12-13

输出 [原文如此] 说:

installer not found

但如果已安装,它会显示 1110(任何数字)。如果输出是&lt;=10 || &gt;=11,那么它会说not installed,然后继续安装。在库中,它给出:

def get_installer_linux_version
  begin
    cmd = Mixlib::ShellOut.new('installer status |grep Version| cut -c12-13')
    cmd.run_command
  rescue Errno::ENOENT => e
    return '0.0'
  end
  return 'Version 10' if cmd.stdout.include? '10'  
  return 'Version 11' if cmd.stdout.include? '11'
end 

在安装配方中是:

if get_installer_linux_version.to_i <= 10 || get_installer_linux_version.to_i >= 11 
  log  'installer is installed'
else
  log 'installer is not installed so procceding with the installation'

【问题讨论】:

  • 认真的吗?说明该语言的一个基本功能被破坏了,这将导致几乎所有编写的代码都无法工作,而不是接受您自己的代码可能存在缺陷? get_installer_linux_version.to_i 返回什么值?
  • 你的问题是什么?
  • 更不用说您正在将字符串 "version XX"(或 nil)与数字进行比较。
  • 什么是ouput
  • get_installer_linux_version.to_i 返回 bash:安装程序:找不到命令

标签: ruby chef-infra


【解决方案1】:

您的代码中有很多地方可能被认为是有缺陷的,但为了您的问题,我将重点关注这一点。

get_installer_linux_version 返回一些可能的值。字符串 "version 10""version 11""0.0"nil。你调用这个函数,然后调用to_i就可以了。

也许这将有助于阐明它:

"version 10".to_i
#=> 0

我猜这不是预期的行为。无论您的get_installer_linux_version 发生什么,在您调用to_i 后返回的字符串将始终为0。然后设置&lt;= 10 的条件,其中0 仍小于10,并记录"installer is installed"

我还冒昧地猜测,使用include? 'XX' 最终会导致您在处理版本号时出现问题,但这是另一个问题。

为了进一步说明,让我编写你的代码,它将永远、永远、永远和你写的一样,看看是否有什么不对劲:

if 0 <= 10 || 0 >= 11 
  log  'installer is installed'
else
  log 'installer is not installed so procceding with the installation'

你期望结果是什么?尽管0 永远不会大于 11,但它始终会小于 10,因此您的结果始终相同。

只是把它放在这里,因为我看你的样本越多,它可能就越相关。

  • &gt;=

    检查左操作数的值是否大于或等于 右操作数的值,如果是则条件为真。

  • &lt;=

    检查左操作数的值是否小于或等于该值 右操作数,如果是则条件为真。

【讨论】:

  • 我的问题是它说“安装程序已安装”,所以它不会继续进行进一步安装
  • 是的,因为您的代码总是按照我的解释进行。 0 总是小于 10,那为什么不呢?你确定你不是打算用&gt;= 10 而不是&lt;= 10?并不是说它会有很大的不同,因为无论如何,在你修复那个方法之前,即使使用它也没有意义。
  • 如果安装了安装程序,输出会说 Version = 10 xxx 我试过一次 if get_installer_linux_version == 10 所以它工作的时候,只有当 = 开始出现问题跨度>
  • 对于您发布的确切代码,这甚至不是理论上的可能性。您的return 语句必须阅读return '10' if cmd.stdout.include? 'Version 10' 才能发生这种情况,它们是倒退的,所以我不得不说您误用== 而不是&lt;= 工作的确切代码。
  • 如果输出包含 10 那么它会说 'Version 10' so long ,现在有可能如果它的 13 或 8 它应该可以继续安装
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 2021-06-28
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多