The main obvious problem with your script is a logic error. In your `elif` clause you are testing for **("not cli" OR "not gui")** when you should be testing for **("not cli" AND "not GUI")**.

With the OR, the test fails if the variable doesn't match either "cli" or "gui". With the AND, it fails only when it doesn't match both.

For example:

```
if [ -z "$interfaceType" ]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be specified. (cli/gui)" && exit 1
elif [[ ! $interfaceType =~ ^[Cc][Ll][Ii]$ && 
 ! $interfaceType =~ ^[Gg][Uu][Ii]$ ]]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be 'cli' or 'gui'" && exit 2
fi
```

However, that can be improved because regular expressions support alternations with the `|` pipe character. e.g.

```
if [ -z "$interfaceType" ]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be specified. (cli/gui)" && exit 1
elif [[ ! $interfaceType =~ ^([Cc][Ll][Ii]|[Gg][Uu][Ii])$ ]]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be 'cli' or 'gui'" && exit 2
fi
```

And can be further improved by setting `nocasematch` which enables case-insensitive matching for `==`, `!=` and `=~` operators, as well as in `case` statements, pattern substitution (e.g. `${parameter/pattern/string}`), and programmable completion.

From `man bash`:

> `nocasematch` If set, bash matches patterns in a case-insensitive fashion
> when performing matching while executing `case` or `[[` conditional
> commands, when performing pattern substitution word expansions,
> or when filtering possible completions as part of programmable completion.

Note that setting `nocasematch` persists until the end of the current script (or shell if you enter it on the command line). You may want to unset it after the regex test if you want case-sensitive matches for other tests.


```
shopt -s nocasematch

if [ -z "$interfaceType" ]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be specified. (cli/gui)" && exit 1
elif [[ ! $interfaceType =~ ^(cli|gui)$ ]]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be 'cli' or 'gui'" && exit 2
fi
```

Finally, if you're going to check whether the variable matches neither `cli` or `gui`, then you don't also need to check if it's empty - because the empty string doesn't match either of those anyway. So, just the following would do:

```
shopt -s nocasematch

if [[ ! $interfaceType =~ ^(cli|gui)$ ]]; then
 echo -e "[${c_RED}ERROR${c_RESET}] the interface type must be 'cli' or 'gui'" && exit 2
fi
```