
Я адаптировал код, который мне нужен, чтобы обрабатывать только один возможный вариант. Либо запустите функцию, либо используйте опцию справки, чтобы дать краткое описание.
activate-jet ()
{
local iarg=0 narg="$#"
while (( narg > 0 )); do
opt="$1" ; iarg=$(( iarg + 1 ))
case $opt in
("-h"|"--help") echo "TODO" ; return ;;
(*) break ;;
esac
done
}
Я хотел бы упростить его еще больше, если это возможно, не вызывая при этом странного поведения пользователя при вызове.
решение1
Это возможно, поскольку вы утверждаете, чтовам нужно толькоодинаргумент, поэтому нет необходимости в цикле или «обёртывании»:
$ activate_jet() {
[[ "$#" -gt 1 ]] && echo "Invalid number of arguments" && return
if [[ ! -z "$1" ]]; then
if [[ "$1" = "-h" || "$1" = "--help" ]]; then
echo "TODO" && return
else
echo "Bad argument" && return
fi
fi
echo "jet activated"
}
$ activate_jet foo bar
Invalid number of arguments
$ activate_jet foo
Bad argument
$ activate_jet -h
TODO
$ activate_jet --help
TODO
$ activate_jet
jet activated
Теперь обратите внимание, что я изменил название функции, заменив дефис на подчеркивание: activate_jet
вместо activate-jet
, потому что дефисможет быть несовместим с некоторыми оболочками:
Выводы
- Дефисы нестандартны. Избегайте их, если вам нужна совместимость между оболочками.
- Используйте подчеркивания вместо дефисов: подчеркивания принимаются везде.