Оболочка цикла возвращает только один файл - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть сценарий оболочки, который ищет файлы формата 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 голосов
/ 09 ноября 2018

Вы можете использовать:

for f in *.yml; do
   echo "submit ajob -J ${f%%_*} -o ${f%%_*}.job sh ${f%.*}.sh"
done > sub.sh
0 голосов
/ 09 ноября 2018

Слишком сложный и хрупкий. Вместо этого используйте операторы глобуса и расширения параметров.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...