Да, getopts
— это инструмент для анализа параметров в соответствии с POSIX (даже в bash
, оболочке GNU):
В:
cmd -abc -dxx -e yy arg -f -g
(с параметром:abcd:e:fg
)
-f
и -g
— обычные аргументы. getopts
останавливается на этом arg
.
Как правило, да:
while getopts...
case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
Если вы хотите обрабатывать параметры способом GNU, где параметры рассматриваются после не -аргументов параметров (, за исключением случаев, когда есть --
или когда в среде есть POSIXLY _CORRECT ), вы можете использовать реализацию util-linux
или busybox getopt
вместо (с другим API ). Этот также поддерживает длинные опции. Однако это не будет переносимо за пределы Linux.
Вы делаете что-то вроде:
parsed_opts=$(getopt -o abcd:e:fg -l long -- "$@") || usage
eval "set -- $parsed_opts"
for o do
case $o in
(-[abcfg]) echo "no-arg option: $o"; shift;;
(--long) echo "long option"; shift;;
(-[de]) printf '%s\n' "option $o with arg $2"; shift 2;;
(--) shift; break;;
(*) echo "never reached";;
esac
done
echo Remaining args:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
Обратите внимание, что их порядок в этих опциях будет -изменен, а их аргументы будут удалены из "оставшихся аргументов":
$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
-a -e 'x' --long -- 'foo' 'bar' 'baz'
Хорошо, проблема была на самом деле с конфигурацией Launchkey, а не с программным обеспечением. Если вы нажмете обе кнопки Octave одновременно, вы можете изменить смещение ноты, например, чтобы она начиналась с 49, или 50, или 51. Поэтому я настроил ее так, чтобы она начиналась с 50.