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