Этот вопрос состоит из 3 частей, и каждая из них проста, но объединить их вместе - не тривиально (по крайней мере, для меня):)
Нужно написать скрипт, который должен принимать в качестве аргументов:
- одно имя другой команды
- несколько аргументов для команды
- список файлов
Примеры:
./my_script head -100 a.txt b.txt ./xxx/*.txt
./my_script sed -n 's/xxx/aaa/' *.txt
и т. Д.
Внутри моего скрипта по какой-то причине мне нужно различать
- что такое команда
- каковы аргументы для команды
- что за файлы
так что, вероятно, самый стандартный способ написать приведенные выше примеры:
./my_script head -100 -- a.txt b.txt ./xxx/*.txt
./my_script sed -n 's/xxx/aaa/' -- *.txt
Вопрос1: Есть ли лучшее решение?
Обработка в ./my_script (первая попытка):
command="$1";shift
args=`echo $* | sed 's/--.*//'`
filenames=`echo $* | sed 's/.*--//'`
#... some additional processing ...
"$command" "$args" $filenames #execute the command with args and files
Это решение не будет работать, если filenames
будет содержать spaces
и / или '-', например,
/ some - путь / к / more / идиотский файл name.txt
Вопрос2: Как правильно получить $command
его $args
и $filenames
для последующего выполнения?
Вопрос3: - как добиться следующего стиля исполнения?
echo $filenames | $command $args #but want one filename = one line (like ls -1)
Это хорошее решение для оболочки или нужно использовать, например, perl?