getopts не работает при вызове с аргументом

Это моя первая попытка использовать getopts, и пока она у меня не работает. Код в моем скрипте:

while getopts "s:" opt; do
 case $opt in
    s) subj=$OPTARG;;
    \?) echo "Incorrect usage";;
 esac
done

echo ""
echo $subj

Когда я пытаюсь запустить скрипт следующим образом:

myScript.sh -s 100

Я хочу, чтобы он повторял указанный мной идентификатор субъекта. Пока что это просто дает мне пустое заявление.


person djl    schedule 13.03.2018    source источник
comment
Не могу воспроизвести, у меня выводит 100. Вы уверены, что запускаете правильный скрипт? myScript.sh требует, чтобы скрипт был исполняемым и находился в каталоге вашего PATH, а текущий рабочий каталог обычно не находится в PATH по соображениям безопасности.   -  person chepner    schedule 13.03.2018
comment
Ах я вижу. Я думаю, что моя проблема также заключалась в том, что я делал source myScript.sh -s 100. Когда я просто набираю myScript.sh -s 100, все работает. Я не уверен, почему это проблема, когда я набираю источник   -  person djl    schedule 13.03.2018
comment
А, держу пари, это сработает при первом использовании source myScript.sh -s 100 в оболочке, не так ли? Счетчик getopts используется, чтобы знать, какой аргумент является следующим, не сбрасывается между последовательными источниками, поэтому getopts просто не видит никаких аргументов для анализа. Явная установка OPTIND=1 перед повторным использованием source должна дать вам ожидаемое поведение.   -  person chepner    schedule 13.03.2018


Ответы (1)


getopts использует текущее значение OPTIND, чтобы узнать, какой аргумент смотреть дальше. Однако если вы используете source для запуска своего скрипта, OPTIND никогда не сбрасывается между вызовами. Вероятно, вы добавили subj после первого запуска, чтобы его значение не было установлено при первом запуске скрипта. Явная установка OPTIND=1 исправит это.

$ source myScript.sh -s 100

100
$ unset subj; source myScript.sh -s 100


$ OPTIND=1
$ source myScript.sh -s 100

100
person chepner    schedule 13.03.2018