Как использовать getopts в скрипте bash?

Я пытаюсь использовать getopts следующим образом:

#!/bin/bash

while getopts "i" option
do
 case "${option}"
 in
 i) INT=${OPTARG};;
 esac
done
echo "$INT"

Но он печатает $INT, только если я использую getopts "i:". Если я правильно понимаю, двоеточия в optstring означают, что для соответствующих флагов требуются значения. Но я хочу сделать этот флаг необязательным. Может ли кто-нибудь объяснить, почему скрипт ведет себя так и как я могу это исправить?


person kusayu    schedule 25.08.2017    source источник
comment
Наличие двоеточия означает, что требуется аргумент параметра. Отсутствие двоеточия означает, что аргумент опции вообще не ожидается. Руководство по Bash на getopts не поддерживает необязательное аргументы. Для этого вам понадобится GNU getopt (с большим количеством различной семантики).   -  person Jonathan Leffler    schedule 26.08.2017
comment
@JonathanLeffler ах, большое спасибо. Я думаю, мне нужно удалить свой вопрос, потому что на него нельзя ответить.   -  person kusayu    schedule 26.08.2017
comment
См. соответствующий вопрос Использование getopts в сценарии оболочки Bash, чтобы получить длинные и короткие параметры командной строки. Это не прямой дубликат, но содержит полезную информацию.   -  person Jonathan Leffler    schedule 26.08.2017
comment
Версия расширенной команды getopt доступна по адресу frodo.looijaard.name/project/getopt.   -  person Jonathan Leffler    schedule 26.08.2017


Ответы (1)


Вы не можете сделать это (bash getopts) необязательным. «getopts» не поддерживает обязательные или необязательные параметры. Вам нужно будет кодировать для этого. И если указано «:», то для этой опции должен быть аргумент. Нет никакого способа обойти это.

В следующих фрагментах кода показано, как проверить наличие обязательных аргументов.

# Mandatory options
arg1=false;
..
...
case "${option}"
 in
 i) INT=${OPTARG}; arg1=true;
 ;;
 esac
 if  ! $arg1;
 then
  echo -e "Mandatory arguments missing";
  # assuming usage is defined
  echo -e ${usage};
  exit 1;
fi
person Khanna111    schedule 25.08.2017