getopts не распознает вопросительный знак

В настоящее время я разбираю параметры в таком скрипте:

while getopts ":ia" OptionArgument; do
case $OptionArgument in
    i ) echo "bli";;
    a ) echo "bla";;
    * ) echo "flag not known";;
    ? ) echo "unknown parameter";;
esac
done

Все опции парсинга и флаги работают, кроме этого: ? ). Поэтому, если я вызываю свой скрипт с чем-то вроде ./MyScript hjrfgdskjgh, он правильно проходит цикл, хотя он должен быть пойман в последней строке с ? ).
Я также пробовал удалять кавычки из ":ia"или использовать \? или . ) - ничего не работает! Что я делаю не так??


person Malvin    schedule 12.06.2013    source источник
comment
* ) echo "flag not known";; делает то, что сделал бы ?. Если вы прокомментируете *) ..., вы заработаете ?).   -  person fedorqui 'SO stop harming'    schedule 12.06.2013
comment
Оба не работают: * ) анализирует только неизвестные флаги, такие как, например. -х или -у. Но он игнорирует случайные слова, такие как kajdhkjefhskef. Если я удалю * ) или заменю it with ? )` из-за порядка - ничего не меняется. Как будто вообще не знает ?...   -  person Malvin    schedule 12.06.2013
comment
getopts будет обрабатывать любой флаг, который имеет - в начале. Если вы выполните ./script -t, он покажет flag not known, но если вы выполните ./script t, вы не предоставите информацию getopts.   -  person fedorqui 'SO stop harming'    schedule 12.06.2013
comment
Ах, теперь я понимаю: поэтому, если я не использую тире -, он вообще его не получает. Я думал, что getopts справится и с этим, но в этом случае я должен проверить это вручную. Большое спасибо, если вы добавите это как ответ, я отмечу это как правильный ответ.   -  person Malvin    schedule 12.06.2013


Ответы (2)


? имеет особое значение, см. http://tldp.org/LDP/abs/html/special-chars.html#WILDCARDQU Его нельзя использовать без экранирования или без кавычек. Вы должны вызвать скрипт с помощью ./script.sh -'?' или ./script.sh -\?

person giordano    schedule 12.06.2013
comment
Технически правильно, но по умолчанию шаблоны, которые ничему не соответствуют, обрабатываются буквально. Вам нужно экранировать ? только в том случае, если в текущем каталоге есть файлы с --начальными 2-символьными именами (что должно происходить редко). - person chepner; 12.06.2013
comment
@chepner это верно в bash, но не во всех оболочках, например. zsh. Портативный скрипт должен учитывать это. - person giordano; 12.06.2013
comment
Стандарт POSIX указывает, что несопоставленный шаблон обрабатывается буквально. zsh пользователям, вероятно, следует использовать setopt NONOMATCH для соответствия стандарту. - person chepner; 12.06.2013

* соответствует чему угодно. Размещать что-либо ниже него бессмысленно, оно будет сопоставляться только в том случае, если * ему не соответствует.

person choroba    schedule 12.06.2013
comment
Даже если я уберу эту строку и просто добавлю вместо нее строку с вопросительным знаком - она ​​не поймает случайный неправильный параметр. Как будто он вообще не распознает ?. - person Malvin; 12.06.2013