Я думаю, что ваше конкретное использование getopts()
здесь необходимо только для того, чтобы сначала проанализировать допустимые флаги опций и поместить их в массив, а затем использовать проанализированные флаги, чтобы убедиться, только если установлен требуемый порядок флагов.
Шаги двоякие.Во-первых, синтаксический анализ допустимых флагов в массиве (multi
), во-вторых, объединение флагов без пробелов и сопоставление регулярных выражений с предоставленными флагами, если вы встретите те, которые не разрешены, не выполняют вашу логику.
#!/usr/bin/env bash
while getopts "cd:ef:his:" opt; do
case "$opt" in
c|d|e|f|h|i|s) multi+=("$opt");;
*) printf 'invalid flag provided' 1>&2 ; exit 1 ;;
esac
done
joined=$(IFS=;echo "${multi[*]}")
if ! [[ $joined =~ ^(hcf|hd|es|cif)$ ]]; then
printf 'valid flags provided\n'
# Add your logic here
fi
Обратите внимание, что в ответе учитывается возможность изменения порядка флагов, т. Е. Если ./myscript.sh -h -c -f <file_name>
не разрешено, следует ли разрешить ./myscript.sh -f <file_name> -h -c
?Необходимо изменить ответ на основе этого.