чтение аргументов для программы из пользовательского файла и запуск этой программы с этими аргументами - PullRequest
0 голосов
/ 08 июля 2011

все!

Мне нужно прочитать аргументы из файла 'data', который состоит из строк вроде:

-a -camb="1 0.5 1",diff="1 0 0" -q=5
-a -camb="0 1 0" -p -q -f=10
...

Далее, эти аргументы должны быть переданы программе ./test в скрипте:

#!/bin/bash

while read line
do
    ./test "$line"
done < "./data"

проблема в том, что $ line передается как argv [1] в ./test, а не как последовательность argv [1], argv [2], argv [3]

Как я могу разбить строку строки на несколько аргументов? То есть ./test должен принимать argv [1], argv [2] и так далее?

Обратите внимание, что -camb = "1 0,5 1", diff = "1 0 0" должно быть целым аргументом, argv [2]!

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Вы можете использовать eval для этого:

#!/bin/bash

while read line
do
    eval "./test $line"
done < "./data"

Здесь есть большое предупреждение: eval может интерпретировать содержимое файла больше, чем вы хотите. Например, если он содержит какие-либо перенаправления ввода / вывода (например, >somefile), они будут применяться. Аналогично, $variable будет заменен , ; somecommand будет выполняться как отдельная команда и т. Д. В основном, если содержимое файла данных недостаточно чистое, может получить неожиданные и потенциально опасные результаты.

1 голос
/ 08 июля 2011

Кавычки буквальные, а не синтаксические , что означает, что они не будут обрабатываться так же, как в оболочке.Но вы можете справиться с ними, установив их в массив:

$ params(){
    for param in "$@"
    do
        echo "$param"
    done
}
$ while IFS= read -r line
do
    declare -a par="($line)"
    params "${par[@]}"
    echo
done < data
-a
-camb=1 0.5 1,diff=1 0 0
-q=5

-a
-camb=0 1 0
-p
-q
-f=10

PS: Не используйте eval.

...