【问题标题】:Loop run an executable against all elements循环对所有元素运行可执行文件
【发布时间】:2022-11-01 13:04:38
【问题描述】:

我非常想找到一种方法来自动清除我的测试服务器中的多个应用程序。我将服务器客户端fortifyclient 安装在一个测试吊舱内,该吊舱可以与服务器通信。所以流程:

  1. 列出我所有的应用程序并 grep 他们所有的应用程序版本 ID
  2. 清除那些应用程序版本 ID
  3. 完成

    因此,作为第一步,我在 pod 中设置了我的环境变量。

    # set env var locally
    export token=value
    export scandate=value
    export sscurl=value
    export dir=/test/bin/./fortifyclient
    

    这是我下面的purge.sh

    #!/bin/bash
    
    # List app, fetch their appID's then purge based on date
    
    for i in $("$dir" listApplicationVersions -url "$sscurl" -authtoken "$token" | grep -P "^[0-9]+" | awk '{print $1}')
    do
       "$dir" purgeApplicationVersion -applicationVersionID "$i" -scanDate "$scandate" -url "$sscurl" -authtoken "$token"
    done
    

    输出

    5513
    4659
    4658
    4688
    4685
    4686
    4687
    4683
    do
       "/test/bin/./fortifyclient" purgeApplicationVersion -applicationVersionID "" -scanDate "value" -url "value" -authtoken "value"
    done
    

    正如您所看到的,当我列出我的应用程序时,第一个参数工作正常,但 purge 的第二个参数不起作用。如您所见,$i 为空,它应该是上面列出的-applicationVersionID 的所有元素为空。我在 bash 方面不是那么强,可以随意分享任何替代方案。我会很感激一些反馈。我知道我很接近。谢谢你

【问题讨论】:

  • 不相关但 grep -P "^[0-9]+" | awk '{print $1}' 可以替换为 grep -oP '^\d\S+'
  • awk '$1 ~ /^[0-9]+/{print $1}'
  • @Jetchisel 是的,这也有效。 + 不是必需的。
  • 尝试了列出的两个建议都不是运气。列出的相同问题-applicationVersionID "" 为空。再次感谢
  • 请参阅 How to read line-by-lineDon't read lines with for 并将您的脚本粘贴到 shellcheck.net 以进行验证/推荐。

标签: bash for-loop fortify


【解决方案1】:

当我尝试重现您的脚本行为时,我的脚本会标记一个关于“$目录" 目录中的引用$().如果您查看 POSIX 引用,它将表明它不能在其他字符中使用“/”扩展任何内容。

这也可能是你的问题。

这表明您的列表应用程序版本应该包含“$dir”引用的任何用法,并将其从 $() 表达式中删除。此外,为了在您的上下文中保持一致性,您可能应该对清除应用程序版本脚本并从您的 purge.sh 中删除“$dir”。

【讨论】:

  • 没有@$(),你的意思是命令替换吗?但我仍然无法理解这一点。为什么要禁止/?无论如何,您所说的“扩展”是什么意思?通配符扩展中的*/ 不匹配,但这里也没有通配符。
  • 对不起,那是一个错字。我修好了它。至于为什么,我更愿意让其他知识渊博的人来做这件事。请参考unix.stackexchange.com/questions/334578/… 和其他shell 文档。
  • 你把它改成了@();你的意思是$()?链接的问题似乎与此问题或您答案中的文字没有任何关系;你链接到错误的吗?
  • 我很抱歉。我不知道是什么让我保留了@ 而不是 $。我已经进行了更正。
  • @EricMarceau 感谢您的反馈,这非常有帮助。我能够按照您的建议进行操作,是的,我将 fortifyclient 添加到了我的 PATH 中,并且该默认用户可以在任何地方运行 fortifyclient。我想出了我的问题并在上面添加了更多内容。我在 bash heredoc 内的子外壳中定义环境变量时遇到了一些问题。
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多