Совместное использование getopts и ${1}

Я пытаюсь написать скрипт, который может одновременно использовать параметры ${1} и getopts. Я хотел бы, чтобы он работал с использованием строки использования:

./test_script test -a

печатать:

test
-a was triggered!

я пробовал

echo ${1};

while getopts "c:a" opt; do
      case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
    esac
done

Который не может предоставить мне доступ к ${1} и обнаружить, что опция -a использовалась одновременно. Есть ли способ использовать оба из них? Я бы не хотел превращать тестовую строку в другую опцию getopts.


person user1382685    schedule 16.07.2013    source источник
comment
Я не понимаю, что вы спрашиваете. У вас есть доступ к $1, и вы можете определить, что -a было передано сценарию. Так что именно вы не можете сделать?   -  person kojiro    schedule 16.07.2013
comment
У меня нет доступа к обоим. С приведенным выше сценарием, если я делаю ./test_script test -a, вывод будет просто test ... если я делаю ./test_script -a test, вывод -a\n-a был запущен! ... Я хочу, чтобы выходной тест\n-a был запущен!   -  person user1382685    schedule 16.07.2013
comment
Ваша проблема может заключаться в том, что getopts останавливается после первого не-варианта. Значение ./test_script -a test работает нормально, а ./test_script test -a нет... На справочной странице getopts сказано следующее: Any of the following shall identify the end of options: the special option "--", finding an argument that does not begin with a '-', or encountering an error.   -  person twalberg    schedule 16.07.2013
comment
Обратите внимание, что поведение, описанное @twalberg, является стандартным (насколько существует стандарт) синтаксисом команды оболочки: параметры предшествуют обычным аргументам. Некоторые команды позволяют опционам идти после обычного аргумента, но это нестандартно.   -  person Gordon Davisson    schedule 16.07.2013


Ответы (1)


Вы можете использовать shift при выходе из getopts. Например:

while [ $# -gt 0 ] ; do
    while getopts "c:a" opt ; do
        case $opt in
            # YOUR OPTIONS
        esac
    done

    OTHER_VALUE=$1
    shift
done

PS: обычно я не использую getopts, но предпочитаю самостоятельно анализировать аргументы следующим образом:

while [ $# -gt 0 ] ; do
    case "$1" in
        '-a' | '--along' ) 
            echo '-a was triggered' ;;
        '-b' | '--blong' ) 
            echo '-b was trigger with arg ' $2 ; 
            shift ;; # One extra shift for the argumnent $2
        * ) 
            echo 'Unknown value (maybe test)' ;;
    esac
    shift
done
person Andrea Carron    schedule 16.07.2013