Как получить аргумент программы в Linux сценарии оболочки при использовании getopts? - PullRequest
1 голос
/ 15 апреля 2020

Итак, у меня есть скрипт, в котором я хочу обработать опции с getopts, но я также хочу читать аргументы самой программы обычным способом. Поэтому в этом примере сценария я хочу обработать параметры, а затем echo аргумент, заданный как ./script.sh -abc theargument. Проблема, которая возникает, заключается в том, что я не знаю, какой это аргумент оболочки. Аргумент не должен быть связан с параметрами, поэтому вы можете также вызвать скрипт как ./script.sh theargument:

#!/bin/sh

while getopts "abc" opt; do
    case $opt in
        a) echo "option a" ;;
        b) echo "option b" ;;
        c) echo "option c" ;;
    esac
done

echo # what?

Я не могу просто shift аргументы с $OPTIND, чтобы сделать его $1, поскольку параметры могут быть заданы как -abc, -a -b -c, -ab -c и т. Д. 1017 *., Поэтому число параметров не соответствует количеству аргументов.

В идеале хочу избежать башизмов

1 Ответ

1 голос
/ 16 апреля 2020

Способ bash состоит в использовании косвенного обращения с ${!VARIABLE} - то, к чему VARIABLE расширяется, рассматривается как параметр для использования, поэтому echo "${!OPTIND}" через некоторое время l oop в вашем пример будет отображать theargument.

Более общий c способ - использовать shift, чтобы отбросить аргументы опции, а затем использовать $1 et c.:

if [ "$OPTIND" -gt 1 ]; then
    shift $((OPTIND - 1))
fi

В вашем примере $OPTIND равно 2 после l oop, поэтому это сместит позиционные параметры влево на 1, отбрасывая -abc и оставляя theargument в $1. Этот подход работает, если вы используете -abc theargument, -ab -c theargument, -a -b -c theargument и т. Д.

...