如何在not_if条件下使用shell脚本

时间:2015-04-29 11:50:47

标签: bash chef recipe

我想使用shell脚本输出来验证处于保护状态的资源。我使用下面的代码仍然无法正常工作。

bash "stampDisksuccess" do
                code <<-EOH
                whoami
        EOH
        user 'root'
        not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
      end

脚本(getStampedDisk.sh)是否返回空白消息或某些数据,bash资源正在执行。我希望它在脚本返回空白数据时不应该运行。

如果有任何遗漏,请纠正我。

1 个答案:

答案 0 :(得分:12)

让我们剖析它:

not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
  • Not_if ......很明显,这是守卫
  • {阻止开放
  • "字符串打开
  • 反击开场
  • 命令
  • 关闭反叛和引用
  • ==运营商
  • ''常量空字符串
  • }关闭块

这是很多操作来测试你有一个空字符串。反引号的输出不保证真的是空的(例如它可以有换行符)然后你将它与任意空字符串(不是nil,它是一个没有任何内容的字符串)进行比较。有很多方法可以变坏,调试非打印字符非常困难。

然而,shell已经有了这个操作符,对于通常的bash来说它是-z

引用bash文档:

-z string
    True if the length of string is zero.

另一个助手是$()来评估脚本中的命令

最后一个[[ ]]构造告诉我们使用的是操作符而不是命令。

当表达为字符串(Documentation on guards here

时,你最终会得到命令执行保护
not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]' 

来自警卫文件的引用:

  

guard属性接受字符串值或Ruby块值:

     
      
  • 字符串作为shell命令执行。如果命令返回0,则   守卫是适用的。如果该命令返回任何其他值,那么   保护属性未应用。
  •   
  • 一个块作为Ruby代码执行   必须返回true或false。如果该块返回true,则保护   属性已应用。如果块返回false,则为guard属性   不适用。
  •   

如果你没有在守卫中使用红宝石,不要使用一个块,你只是添加图层会让你遇到麻烦,特别是当你试图比较不可打印或空字符串并且它更难调试,如果需要调用命令或脚本,请尝试坚持使用标准shell命令,您可以在控制台中测试它,并确保以后不会出现问题。