Запускать команду с аргументами несколько раз

Я получил файл с некоторыми параметрами скрипта:

foo1 a b c
foo2 a b c
foo3 a b c

Мне нужно запустить скрипт один раз для каждой строки в этом файле, передавая строку как аргумент сценария, поэтому он должен сделать:

./MyScript.sh foo1 a b c
./MyScript.sh foo2 a b c
./MyScript.sh foo3 a b c

Как я могу добиться этого с помощью Bash?

2 ответа

Решение

xargs Команда, которая создается для запуска команды с аргументами, которые считываются из стандартного ввода, имеет --arg-file параметр, который позволяет читать аргументы из файла. В комбинации с-L1 флаг, он будет читать файл аргументов построчно, и для каждой строки выполнять команду. Вот пример:

$ cat args.txt
one two three
four file six

$ xargs -L1 --arg-file=args.txt echo                       
one two three
four file six

замещать echo с вашим сценарием.

Кроме того, вы всегда можете перенаправить файл для чтения xargs из потока stdin вот так:

$ xargs -L1  echo < args.txt                                                                                             
one two three
four file six

Используя while цикл:

#!/bin/bash
while IFS= read -r line; do
   # if the line read is empty 
   # go to the next line. Skips empty lines
   if [ -z "${line}" ]
   then
       continue
   fi
  /path/to/MyScript.sh $line
done < "$1"

Тогда назовите этот скрипт anything.sh и запустите это так:

anything.sh /path/to/file/with/foo

Не забудьте сделать оба anything.sh а также MyScript.sh исполнимый

Другие вопросы по тегам