Shell循环仅返回一个文件

时间:2018-11-09 18:00:00

标签: bash shell for-loop

我有一个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

2 个答案:

答案 0 :(得分:1)

方法过于复杂和脆弱。请改用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

答案 1 :(得分:1)

您可以使用:

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