С риском добавления другого примера для игнорирования, вот моя схема.
-n arg
и --name=arg
Надеюсь, что это кому-то полезно.
while [ "$#" -gt 0 ]; do
case "$1" in
-n) name="$2"; shift 2;;
-p) pidfile="$2"; shift 2;;
-l) logfile="$2"; shift 2;;
--name=*) name="${1#*=}"; shift 1;;
--pidfile=*) pidfile="${1#*=}"; shift 1;;
--logfile=*) logfile="${1#*=}"; shift 1;;
--name|--pidfile|--logfile) echo "$1 requires an argument" >&2; exit 1;;
-*) echo "unknown option: $1" >&2; exit 1;;
*) handle_argument "$1"; shift 1;;
esac
done
Чтобы расширить регулярное выражение, чтобы при желании можно было использовать только одно подчеркивание за раз, которое слишком зажато в строке, вы можете использовать это регулярное выражение.
[A-Za-z][A-Za-z0-9]*(_[A-Za-z0-9]+)*
Я только что добавил (_[A-Za-z0-9]+)*
часть, которая будет позволять одиночному подчеркиванию, за которым следует по крайней мере один буквенно-цифровой символ, целое его ноль или более раз, чтобы сделать подчеркивание необязательным.
Теперь вам придется позаботиться о других аспектах, так как я не знаком с флексом.
В вашем [A-Za-z]([A-Za-z0-9][_]?[A-Za-z0-9])*
первое [A-Za-z0-9]
может / должно быть опущено (рассмотрим, например, однобуквенные идентификаторы), что приводит к [A-Za-z]([_]?[A-Za-z0-9])*
. Кажется, это именно то, о чем спрашивали, и это хорошее упражнение для изучения эффектов объединения необязательных элементов при повторении в регулярном выражении.