在木偶模板中检查变量是否为undef的正确方法是什么?
在清单中,变量定义如下
$myvar = undef
如何在模板中检查?
看到以下两个变种
<% if @myvar -%>
<% end -%>
和
<% if not @myvar.nil? and @myvar -%>
<% end -%>
它们似乎都适用于我的情况,但我想知道第一种方法是否在某些情况下失败了?
答案 0 :(得分:7)
Puppet文档(在撰写本答案时)解释得非常好:https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365
由于undef
与false
不同,因此仅使用if
不是检查它的好方法。此外,当定义变量但值为false
或nil
时,也无法使用简单的if
进行检查。
这就是为什么您要使用scope.lookupvar(‘variable’)
并检查其:undef
或:undefined
(或nil
)的返回值,以了解它是否设置为{{1或者永远不会设置。
答案 1 :(得分:3)
我说检查取决于在未定义变量时是否需要替代方案。
我使用以下规则:
在考虑模板渲染之前,检查您的木偶脚本中变量是否包含预期值:
if $myvar == undef {
fail {"You really must set myvar, seriously."}
}
if ! $anothervar {
fail {"anothervar is false, undefined or empty."}
}
通过明确设置参数类型,您可以简化生活。这使您无需键入比较和转换。
在模板中,您只需编写变量:
<%= @myvar %>
<%= @anothervar %>
如果您假定已定义变量,则可将其视为布尔值。
映射如下(source):
在Puppet&gt; = 4:
<强>示例:强>
打印&#39;某些东西&#39;如果@myvar评估为真,否则&#39;其他内容&#39;。
<% if @myvar %>something<% else %>something else<% end %>
打印&#39;某些东西&#39;如果@myvar评估为真
<% if @myvar %>something<% end %>
如果评估为真,则打印@myvar,否则&#39;替代&#39; %GT;
<%= @myvar ? @myvar : 'alternative' %>
如果您不确定变量是否已定义且不想做出错误的假设,请在模板中进行检查。
<强>示例:强>
打印&#39;某些东西&#39;如果@myvar已定义且不为空,则为@myvar
<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>
打印@myvar,如果已定义且大于10
<%= @myvar if defined?(@myvar) && @myvar > 10 %>
答案 2 :(得分:2)
第一个应该像魅力一样工作,这也是课程中教授的内容。
第二号似乎......多余。