【问题标题】:Shell loop returns only one fileShell 循环只返回一个文件
【发布时间】:2018-11-09 17:59:59
【问题描述】:

我有一个 shell 脚本,它查找 Ceratin 格式的文件,并在 for 循环中获取部分字符串并调用命令,因为我有几个文件需要打印出来。 以下是我需要返回到sub.sh的文件

CAP_1_34.yml
SAP_34_5.yml
CAP_1_34.sh
SAP_34_5.sh

以下是我使用的脚本,

 for name in `ls -1 *yml| xargs -I% echo % | cut -d'_' -f 1`
        do
        ls -1 *.sh |xargs -I% echo submit ajob -J "${name}" -o "${name}".job sh % >sub.sh
done

但上面的脚本只是返回 sub.sh 中最后一个文件的名称 现在sub.sh 如下所示

submit ajob -J SAP -o SAP.job sh CAP_1_34.sh
submit ajob -J SAP -o SAP.job sh SAP_34_5.sh

正如我所期望的那样,

submit ajob -J CAP -o CAP.job sh CAP_1_34.sh
submit ajob -J SAP -o SAP.job sh SAP_34_5.sh

【问题讨论】:

  • 每次循环迭代都会覆盖sub.sh,因此只有$name的最后一个值是可观察到的。

标签: bash shell for-loop


【解决方案1】:

你可以使用:

for f in *.yml; do
   echo "submit ajob -J ${f%%_*} -o ${f%%_*}.job sh ${f%.*}.sh"
done > sub.sh

【讨论】:

    【解决方案2】:

    太复杂和脆弱了。请改用 glob 和参数扩展运算符。

    make_job () {
        printf 'submit job -J "%s" -o "%s" sh "%s"\n' "$1" "$1" "$2"
    }
    for f in *.yml; do
      prefix=${f%%_*}
      for s in "$prefix"_*.sh; do
        make_job "$prefix" "$s"
      done
    done > sub.sh
    

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多