Задать вопрос
@denislysenko
data engineer

Как написать bash скрипт, который будет запускать файл, который поддерживает аргументы командной строки?

У меня есть файл get-movies.py.

Я могу вызывать его таким образом: python3 get-movies.py.

Этот файл поддерживает 5 аргументов:
-year_from (если аргумент не пишут после названия файла то он по дефолту равен 1800)
-year_to (если аргумент не пишут после названия файла то он по дефолту равен 2030)
-N (если аргумент не пишут после названия файла то он по дефолту равен None)
-regexp (если аргумент не пишут после названия файла то он по дефолту равен '')
-genres (если аргумент не пишут после названия файла то он по дефолту равен '')

Не знаю, насколько это важно, но в скобках выше указал значения, которые в файле они принимают по дефолту.

То есть, я в терминале могу запускать этот файл прописывая после названия файла эти аргументы, например:

python3 get-movies.py -year_from 2005 -regexp 'Terminator'  -genres 'Action' -N 3

Еще пример:

python3 get-movies.py -N 3 -regexp 'Terminator'

Еще пример:

python3 get-movies.py -genres 'Comedy' -N 3

Вообще, мне нужно написать bash скрипт, который будет называться к примеру file.sh это файл должен запускать файл get-movies.py, который лежит в той же директории, что и file.sh и file.sh должен также принимать эти аргументы командной строки.

То есть, если я делаю: file.sh -N 3 -regexp 'Terminator', то этот file.sh внутри себя должен запускать get-movies.py с такими же параметра, то есть, он должен внутри себя сделать так: python3 get-movies.py -N 3 -regexp 'Terminator'
Но я не понимаю, как написать такой скрипт, чтобы эти аргументы можно было передавать в разном порядке, а можно было и вовсе не передавать, но чтобы в любом случае этот file.sh запускал get-movies.py.
  • Вопрос задан
  • 164 просмотра
Подписаться 2 Средний Комментировать
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
#!/bin/bash
python3 get-movies.py "$@"


Тут запись "$@" означает передать все аргументы скрипта как они есть, причём с правильным экранированием, то есть "Termninator 2" будет передано как "Terminator 2", а не "Terminator" "2".

upd: Ещё добавлю, что для такого простого случая может больше подойти другой подход: передача интерпретатора через шебанг. Надо первой строкой файла get-movies.py указать:

#!/usr/bin/env python3

В этом случае запуск скрипта будет приводить к вызову /usr/bin/env python3 get-movies.py со всеми остальными параметрами.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы