gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:16:52 25 4
gpt4 key购买 nike

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

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

无论脚本 (getStampedDisk.sh) 返回空白消息还是一些数据,bash 资源都会被执行。当脚本返回空白数据时,我期望它不应该运行。

如有遗漏请指正

最佳答案

让我们剖析一下:

not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
  • Not_if ...很明显,是守卫
  • { 阻止打开
  • "字符串开头
  • 反引号开头
  • 命令
  • 结束反引号和引号
  • == 运算符
  • ''常量空字符串
  • } 结束 block

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

但是 shell 已经有一个操作符,它是 -z 用于通常的 bash。

引用 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) ]]' 

引自守卫文档:

A guard attribute accepts either a string value or a Ruby block value:

  • A string is executed as a shell command. If the command returns 0, the guard is applied. If the command returns any other value, then the guard attribute is not applied.
  • A block is executed as Ruby code that must return either true or false. If the block returns true, the guard attribute is applied. If the block returns false, the guard attribute is not applied.

如果你不在 guard 中使用 ruby​​,也不要使用 block,你只是在添加层,这会给你带来麻烦,特别是当你尝试比较不可打印或空字符串时,调试起来更难,如果您需要调用命令或脚本,请尝试坚持使用标准 shell 命令,您可以在控制台中对其进行测试,以确保稍后不会出现问题。

关于bash - 如何在 not_if 条件下使用 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29942892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com