Я использую getopts для разбора аргументов в скриптах bash как
while getopts ":hd:" opt; do
case $opt in
d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
exeparams="$*"
exeparams
будет содержать любые непарсированные параметры / аргументы. Поскольку я хочу использовать exeparams для хранения параметров для команды, выполняемой в сценарии (которая может перекрываться с собственными параметрами сценария), я хочу использовать - для завершения параметров, передаваемых сценарию. Если я прохожу, например,
myscript -d myscriptparam -- -d internalparam
exeparams
будет держать
-- -d internalparam
Теперь я хочу удалить ведущий, --
чтобы передать эти аргументы внутренней команде. Есть ли элегантный способ сделать это, или я могу получить строку, которая содержит только остаток --
от getopts?
shift; OPTIND=1
вgetopts
цикл, вероятно, не лучший способ сделать это. Это работает только в вашем случае, потому что у вас есть только 2 варианта, а во всех остальных вы просто выходите из скрипта. В противном случае вам понадобитсяshift; OPTIND=1
каждая опция, что означает дублирование кода (плохая практика). Просто сделайтеshift $((OPTIND - 1))
сразу после окончания цикла - это самый обычный способ и, вероятно, самый эффективный.Ответы:
Как насчет:
Обратите внимание, вы должны использовать массив для хранения параметров. Это будет правильно обрабатывать любые аргументы, содержащие пробелы. Разыменовать массив с
"${exeparams[@]}"
источник
--
, т. Е. Ониscript foo -- bar
будут переданыfoo -- bar
внешней программе. Мой ответ не делает этого предположения, поскольку это не было явно указано в вопросе.-- -d internalparams
. В любом случае мой ответ достаточно общий, чтобы справиться с любым из этих случаев.Используйте встроенный
shift
. Сначала сделайте нормальныйgetopts
для вашего скрипта. Как только этот цикл завершится,вытеснит все уже обработанные опции.
Оттуда вам придется закончить обработку неопционных аргументов, если они есть, до первой части скрипта (до
--
). Как только вы столкнетесь с--
, сдвиньте его, пока не останется только последняя часть (-d internalparam
часть, которая идет после--
). Один из способов сделать это (используяbash
синтаксис):Наконец, остается только второй набор опций / аргументов, который вы можете передать. Как НЕ использовать ,
$*
чтобы передать остальные параметры в другую команду. Используйте"$@"
вместо этого, что сохраняет оригинальное разбиение слова.источник
--
?