> For the complete documentation index, see [llms.txt](https://taqiyeddine.gitbook.io/exploring-it/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taqiyeddine.gitbook.io/exploring-it/devops/bash-scripting-and-system-configuration-certificate-notes/bash-scripting-and-system-configuration/week-1/user-interaction-and-real-world-bash.md).

# User Interaction and Real World Bash

## User Interaction and Real World Bash

user-interaction.pdf

**3. Options**

```bash
while getopts u:p: option; do
        case ${option} in
                u) user=$OPTARG;;
                p) pass=$OPTARG;;
        esac
done

echo "user:$user / pass: $pass"
```

In our script, we can use the `getopts` keyword. We specify an opt string (option string) that defines the search criteria.

Here, we utilize `u:p:`. This means the script will have `-u` and `-p` options. A colon after each option indicates that the script expects an argument for each.

Within the loop, we assign each option to the variable option and utilize it in a case statement.

The `OPTARG` variable holds the argument value for each option.

Then, we finish our script with an echo statement, and save.

```bash
while getopts :u:p:ab option; do
	case $option in
		u) user=$OPTARG;;
		p) pass=$OPTARG;;
		a) echo "got the A flag";;
		b) echo "got the B flag";;
		?) echo "I don't know what $OPTARG is!";;
	esac
done

echo "user:$user / pass: $pass"
```

Adding a question mark `?` will capture these unknown options in the case statement.

5.**Input During Execution**

```bash
#!/bin/bash

echo "What is your name?"
read name

echo "What is your password?"
read -s pass

read -p "What's your favorite animal? " animal

echo "Name: $name, Password: $pass, Fave Animal: $animal"

echo "Which animal"
select animal in "cat" "dog" "bird" "fish"

do
    echo "You selected $animal!"
    break
done
```

**6. Responding**

\*\***Using the `-i` option with the `read` command allows us to suggest a response for the user. If the user presses `return` without entering a response, the suggested response will be used by default.**

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

read -ep "What is your pet's name? " -i "Pabu" petname

echo $petname
```

We can use a regular expression to check whether:

* the input `$zipcode`
* matches a 5-digit pattern `{5}`
* containing digits `[0-9]`

When the condition is true, the loop stops and the program carries on.

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

read -p "Please enter a 5-digit zip code: [nnnnn]" zipcode

until [[ $zipcode =~ [0-9]{5} ]]; do
    read -p "Still waiting on that zip code! [nnnnn] " zipcode
done

echo "Your zip code is $zipcode
```

**7. Discovery 1**

\*\***1. Use the `read` command to request user input and return only after reading exactly  55 characters**

**Solution:** The `-N numOfChar` returns only after reading exactly `numOfChar` characters, unless **EOF** is encountered or read times out.

`read -N 5`

The `-n` option allows us to define a character limit for a response.

```bash
read -n 20 -p "What is your favorite show?" faveShow
```

The `-t` option allows us to limit the amount of time taken to input text.

```bash
read -t 10 -p "What is the capital of Alaska?"
```

##

In Bash scripting, **`set -x`** is a command that enables the debugging mode, where the shell will print each command before it's executed. This is useful for understanding the flow of a script and debugging any issues.

Here's a simple example to demonstrate how **`set -x`** works:

```bash
bashCopy code
#!/bin/bash

# Enable debugging
set -x

# Sample script
echo "Starting the script"
name="John"
age=30
echo "My name is $name, and I'm $age years old."
echo "End of the script"

# Disable debugging
set +x

```
