【问题标题】:How can I do a for loop in shell如何在 shell 中执行 for 循环
【发布时间】:2019-03-23 13:04:12
【问题描述】:

我在一个文件中有以下内容:

[Class:ABCD_EFGH_IJK]
list.0=VALUE001*
list.1=VALUE002*
list.2=VALUE003*
list.3=VALUE004*
[Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK]
condition=true

[Class:LMNO_PQRS_TUV]
list.0=VALUE004*
list.1=VALUE005*
list.2=VALUE006*
list.3=VALUE007*
[Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV]
condition=true

我有另一个使用类名和列表值作为参数运行的脚本。例如:

./myscript VALUE001* ABCD_EFGH_IJK

我需要使用 for 循环来遍历每个类并获取每个值来运行我的脚本。我怎样才能做到这一点?

【问题讨论】:

  • 在 Python 中执行此操作非常简单。但是你只想要 shell 中的解决方案吗?
  • 嗨!是的,我想我想要一个使用 shell 的解决方案。
  • wrt I need use a for loop - 不,你绝对不会。见why-is-using-a-shell-loop-to-process-text-considered-bad-practiceedit您的问题包括预期输出以及您迄今为止尝试过的内容。= 这样我们就可以为您提供帮助。

标签: bash shell for-loop awk scripting


【解决方案1】:

这是你要求的:

$ awk -F'[]:=[]' '/Class:/{class=$3} /^list/{print $2, class}' file |
    xargs -n2 echo ./myscript
./myscript VALUE001* ABCD_EFGH_IJK
./myscript VALUE002* ABCD_EFGH_IJK
./myscript VALUE003* ABCD_EFGH_IJK
./myscript VALUE004* ABCD_EFGH_IJK
./myscript VALUE004* LMNO_PQRS_TUV
./myscript VALUE005* LMNO_PQRS_TUV
./myscript VALUE006* LMNO_PQRS_TUV
./myscript VALUE007* LMNO_PQRS_TUV

当您准备好实际调用 ./myscript 时删除 echo

【讨论】:

    【解决方案2】:

    sed 中使用 Hold 空间的一个可怕的例子(太复杂)是

    sed -nr '/\[Class:/ {s/\[Class:(.*)\]/\1/;h};/list/{G;s#.*=(.*)\n#./myscript \1 #p}' file
    

    一句话:
    当您看到带有Class: 的行时,将类名复制到保留空间中。 当您看到带有 list 的行时,将 Hold 空格(类名)附加到当前行,
    并使用插入的换行符来修改第一部分。
    打印该行。

    当替换字符串具有\ 时,使用#
    () 中记住的匹配字符串会用\1 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      相关资源
      最近更新 更多