# Interactive Menu

Build interactive Bash menus. This guide shows you how to create a menu where users choose which actions to run, leveraging previously defined functions for server status checks:

* Memory usage
* CPU load
* TCP connections
* Kernel version

Here's the base script containing these functions:

```bash
#!/usr/bin/env bash

##
# Server status script:
#   - Memory usage
#   - CPU load
#   - Number of TCP connections
#   - Kernel version
##

server_name=$(hostname)

function memory_check() {
    echo ""
    echo "Memory usage on ${server_name}: "
    free -h
    echo ""
}

function cpu_check() {
    echo ""
    echo "CPU load on ${server_name}: "
    echo ""
    uptime
    echo ""
}

function tcp_check() {
    echo ""
    echo "TCP connections on ${server_name}: "
    echo ""
    cat /proc/net/tcp | wc -l
    echo ""
}

function kernel_check() {
    echo ""
    echo "Kernel version on ${server_name}: "
    echo ""
    uname -r
    echo ""
}

function all_checks() {
    memory_check
    cpu_check
    tcp_check
    kernel_check
}
```

We'll now integrate this with a menu, allowing users to select a function to execute.

---

### Add Color for Readability

Enhance your menu's readability with simple color functions. Add these variables and functions to your script:

```bash
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
red='\e[31m'
clear='\e[0m'

##
# Color Functions
##

ColorGreen(){
    echo -ne $green$1$clear
}
ColorBlue(){
    echo -ne $blue$1$clear
}
ColorRed(){
    echo -ne $red$1$clear
}
```

Use them like: `$(ColorBlue 'Your text')`.

---

### Build the Interactive Menu

Create a `menu` function containing the display logic, user input, and a `case` statement for selection.

```bash
menu(){
echo -ne "
My Server Status Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
    read -r a
    case $a in
        1) memory_check ; menu ;;
        2) cpu_check ; menu ;;
        3) tcp_check ; menu ;;
        4) kernel_check ; menu ;;
        5) all_checks ; menu ;;
        0) exit 0 ;;
        *) echo -e $(ColorRed 'Invalid option.') ; menu ;;
    esac
}
```

Here's how it works:
* The `echo -ne` block prints the menu options, applying colors.
* `read -r a` captures user input into variable `a`.
* The `case` statement executes the corresponding function. After each function, `menu` is called again to display the menu for another choice, creating a loop. `exit 0` handles the exit option.

Finally, call the `menu` function at the end of your script to start the interaction:

```bash
menu
```

---

### Complete Script and Testing

Here's the entire script, `menu.sh`, combining all components:

```bash
#!/usr/bin/env bash

##
# BASH menu script that checks:
#   - Memory usage
#   - CPU load
#   - Number of TCP connections
#   - Kernel version
##

server_name=$(hostname)

function memory_check() {
    echo ""
    echo "Memory usage on ${server_name}: "
    free -h
    echo ""
}

function cpu_check() {
    echo ""
    echo "CPU load on ${server_name}: "
    echo ""
    uptime
    echo ""
}

function tcp_check() {
    echo ""
    echo "TCP connections on ${server_name}: "
    echo ""
    cat /proc/net/tcp | wc -l
    echo ""
}

function kernel_check() {
    echo ""
    echo "Kernel version on ${server_name}: "
    echo ""
    uname -r
    echo ""
}

function all_checks() {
    memory_check
    cpu_check
    tcp_check
    kernel_check
}

##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
red='\e[31m'
clear='\e[0m'

##
# Color Functions
##

ColorGreen(){
    echo -ne $green$1$clear
}
ColorBlue(){
    echo -ne $blue$1$clear
}
ColorRed(){
    echo -ne $red$1$clear
}

menu(){
echo -ne "
My Server Status Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
    read -r a
    case $a in
        1) memory_check ; menu ;;
        2) cpu_check ; menu ;;
        3) tcp_check ; menu ;;
        4) kernel_check ; menu ;;
        5) all_checks ; menu ;;
        0) exit 0 ;;
        *) echo -e $(ColorRed 'Invalid option.') ; menu ;;
    esac
}

# Call the menu function
menu
```

Save this code as `menu.sh`:

```bash
touch menu.sh
```

Open `menu.sh` and paste the script. Save and close. Then, make it executable and run:

```bash
chmod +x menu.sh
./menu.sh
```

You'll see the colored menu, prompting for input. Select an option (e.g., `1` for memory check), and the corresponding information will display before the menu reappears, ready for another choice.

---

### Conclusion

You've built an interactive Bash menu, allowing users to effortlessly navigate script functionalities. This enhances user experience for your automation tools.

> {notice} This content was inspired by a piece by softwareshinobi on Dev Team Six.
