Поместите его в функцию и вызовите его дважды, примерно так:
#!/usr/bin/env bash
prompt() {
local opt
local -A isExpected
local -a options
PS3="$1"
shift
options=()
for opt; do
isExpected["$opt"]=1
options+=("$opt")
done
isExpected["exit"]=1
options+=("exit")
select opt in "${options[@]}"
do
if (( "${isExpected[$opt]}" )); then
case $opt in
"option 1")
something
;;
"option 2")
something
;;
"option 3")
something
;;
"exit")
;;
*) printf 'invalid option "%s"\n' "$REPLY" >&2;;
esac
else
printf 'unexpected option "%s"\n' "$opt" >&2
fi
read -r -p "Press Enter to continue"
clear
return 1
done
}
prompt "some menu" "option 1" "option 2" "option 3"
prompt "some menu 2" "option 1" "option 2"
Очевидно, что вы можете переместить все общие параметры в prompt()
, как я это сделал для "exit"
. Если порядок представленных опций не имеет значения, тогда вы можете избавиться от isExpected[]
и просто использовать один ассоциированный массив для хранения options
и доступа для выбора, используя ${!options[@]}"
.