2013-06-12 2 views
1

я в настоящее время разбора вариантов в сценарии, как, что: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" или с помощью \? или .) - ничего не работает! Что я делаю неправильно?

+0

Использует ли?? Работа? –

+0

'*) echo" flag not known ";;' делает то, что '?' Будет делать. Если вы прокомментируете '*) ...' вы получите '?)' Работа. – fedorqui

+0

Оба не работают: '*)' только анализирует неизвестные флаги, такие как, например, -x или -y. Но он игнорирует случайные слова типа 'kajdhkjefhskef'. Если я удалю '*)' или заменим 'it на '?) 'из-за заказа - ничего не меняется. Это похоже на то, что он вообще не знает '?' ... – Malvin

ответ

0

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

+0

Даже если я удалю эту строку и просто добавлю строку с вопросительным знаком, вместо нее - она ​​не поймает случайный неправильный параметр. Как будто он вообще не распознает '?'. – Malvin

1

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

+0

Технически корректно, но поведение по умолчанию заключается в том, чтобы обрабатывать шаблоны, которые буквально не соответствуют чему-либо. Вам нужно только избегать '?', Если в текущем каталоге есть файлы с ~ -'-начальными, 2-символьными именами (что редко бывает). – chepner

+0

@chepner, это правда в bash, но не во всех оболочках, например. 'Zsh'. Портативный сценарий должен учитывать это. – giordano

+1

Стандарт POSIX указывает, что безупречный шаблон обрабатывается буквально. Пользователи 'zsh', вероятно, должны использовать' setopt NONOMATCH', чтобы соответствовать стандарту. – chepner