Использование 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.

1 ответ

Вы можете использовать сдвиг при выходе из 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
Другие вопросы по тегам