EN
Bash - interactive menu example (arrow up and down selection)
9 points
In this article, we would like to show how to create a simple interactive menu in Bash. The presented solution lets users to navigate in the menu using arrow keys.

Practical example:
xxxxxxxxxx
1
2
3
function print_menu() # selected_item, ...menu_items
4
{
5
local function_arguments=($@)
6
7
local selected_item="$1"
8
local menu_items=(${function_arguments[@]:1})
9
local menu_size="${#menu_items[@]}"
10
11
for (( i = 0; i < $menu_size; ++i ))
12
do
13
if [ "$i" = "$selected_item" ]
14
then
15
echo "-> ${menu_items[i]}"
16
else
17
echo " ${menu_items[i]}"
18
fi
19
done
20
}
21
22
function run_menu() # selected_item, ...menu_items
23
{
24
local function_arguments=($@)
25
26
local selected_item="$1"
27
local menu_items=(${function_arguments[@]:1})
28
local menu_size="${#menu_items[@]}"
29
local menu_limit=$((menu_size - 1))
30
31
clear
32
print_menu "$selected_item" "${menu_items[@]}"
33
34
while read -rsn1 input
35
do
36
case "$input"
37
in
38
$'\x1B') # ESC ASCII code (https://dirask.com/posts/ASCII-Table-pJ3Y0j)
39
read -rsn1 -t 0.1 input
40
if [ "$input" = "[" ] # occurs before arrow code
41
then
42
read -rsn1 -t 0.1 input
43
case "$input"
44
in
45
A) # Up Arrow
46
if [ "$selected_item" -ge 1 ]
47
then
48
selected_item=$((selected_item - 1))
49
clear
50
print_menu "$selected_item" "${menu_items[@]}"
51
fi
52
;;
53
B) # Down Arrow
54
if [ "$selected_item" -lt "$menu_limit" ]
55
then
56
selected_item=$((selected_item + 1))
57
clear
58
print_menu "$selected_item" "${menu_items[@]}"
59
fi
60
;;
61
esac
62
fi
63
read -rsn5 -t 0.1 # flushing stdin
64
;;
65
"") # Enter key
66
return "$selected_item"
67
;;
68
esac
69
done
70
}
71
72
73
# Usage example:
74
75
selected_item=0
76
menu_items=('Login' 'Register' 'Guest' 'Exit')
77
78
run_menu "$selected_item" "${menu_items[@]}"
79
menu_result="$?"
80
81
echo
82
83
case "$menu_result"
84
in
85
0)
86
echo 'Login item selected'
87
;;
88
1)
89
echo 'Register item selected'
90
;;
91
2)
92
echo 'Guest item selected'
93
;;
94
3)
95
echo 'Exit item selected'
96
;;
97
esac