На этот вопрос уже есть ответ здесь:
У меня есть файл с некоторыми параметрами сценария:
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?
xargs
, которая создается для запуска команды с аргументами, которые считываются из stdin, имеет параметр --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
, и [ 115] исполняемый файл