📖 Scenario: You are writing a simple command-line tool that accepts options to customize its behavior. This tool will accept a name and an age as options and then display a greeting message.
🎯 Goal: Build a bash script that uses getopts to parse -n for name and -a for age options, then prints a greeting message using the provided values.
📋 What You'll Learn
Create variables to hold name and age
Use getopts to parse -n and -a options
Assign the option values to the correct variables
Print a greeting message using the parsed name and age
💡 Why This Matters
🌍 Real World
Many command-line tools use option parsing to customize their behavior. Learning <code>getopts</code> helps you build flexible scripts.
💼 Career
Understanding option parsing is essential for scripting tasks in system administration, DevOps, and automation roles.
Progress0 / 4 steps
1
Create variables for name and age
Create two variables called name and age and set both to empty strings.
Bash Scripting
Hint
Use name="" and age="" to create empty string variables.
2
Set up getopts to parse options
Add a while loop using getopts to parse options -n and -a. Use opt as the option variable.
Bash Scripting
Hint
Use while getopts "n:a:" opt; do and a case statement to assign $OPTARG to name or age.
3
Assign option values inside the loop
Inside the case statement, assign the value of $OPTARG to the variables name for option -n and age for option -a.
Bash Scripting
Hint
Use n) name="$OPTARG" ;; and a) age="$OPTARG" ;; inside the case statement.
4
Print the greeting message
After the getopts loop, print the message Hello, NAME! You are AGE years old. replacing NAME and AGE with the variables name and age using echo.
Bash Scripting
Hint
Use echo "Hello, $name! You are $age years old." to print the message.
Practice
(1/5)
1. What is the main purpose of the getopts command in bash scripting?
easy
A. To read input from a file
B. To parse command-line options and their arguments easily
C. To execute commands in parallel
D. To create new files automatically
Solution
Step 1: Understand the role of getopts
getopts is a built-in bash command designed to handle command-line options and their arguments in scripts.
Step 2: Compare with other options
Other options like executing commands or reading files are not related to option parsing, which is the specific task of getopts.
Final Answer:
To parse command-line options and their arguments easily -> Option B
Quick Check:
getopts = option parsing [OK]
Hint: Remember: getopts reads options, not files or commands [OK]
Common Mistakes:
Confusing getopts with file reading commands
Thinking getopts runs commands in parallel
Assuming getopts creates files
2. Which of the following is the correct syntax to start parsing options with getopts in a bash script?
easy
A. while getopts "ab:" opt; do case $opt in a) echo "Option a" ;; b) echo "Option b with $OPTARG" ;; esac; done
B. for opt in getopts "ab:"; do echo $opt; done
C. if getopts "ab:" opt; then echo $opt; fi
D. getopts -a -b
Solution
Step 1: Identify correct getopts usage
The correct way to use getopts is inside a while loop with a case statement to handle each option.
Step 2: Check each option
The correct syntax uses while getopts "ab:" opt; do ... case $opt in a)... b)... esac; done. Other options use invalid control structures like for or if, or incorrect command syntax.
Final Answer:
while getopts "ab:" opt; do case $opt in a) echo "Option a" ;; b) echo "Option b with $OPTARG" ;; esac; done -> Option A
Quick Check:
while + getopts + case = correct syntax [OK]
Hint: Use while loop with getopts and case for options [OK]
Common Mistakes:
Using for loop instead of while
Missing case statement for options
Incorrect getopts command syntax
3. What will be the output of the following script if run as ./script.sh -a -b value?
while getopts "ab:" opt; do
case $opt in
a) echo "Option a set" ;;
b) echo "Option b set with $OPTARG" ;;
esac
done
medium
A. Option a set
Option b set with value
B. Option a set
Option b set with -b
C. Option b set with value
D. No output
Solution
Step 1: Analyze the command line arguments
The script is called with -a and -b value. Option a has no argument, b requires an argument.
Step 2: Trace getopts parsing
getopts processes the arguments sequentially. It first encounters -a, sets $opt to a, and echoes Option a set
Option a set
Option b set with -b set with value set. Next, -b value sets $opt to b and $OPTARG to value, echoing Option a set
Option b set with -b set with value.
Final Answer:
Option a set
Option b set with value -> Option A
Quick Check:
Options a and b with argument = output A [OK]
Hint: Remember colon means option needs argument [OK]
Common Mistakes:
Confusing option argument with option name
Ignoring option arguments
Assuming options print nothing
4. Given this snippet:
while getopts "ab:" opt; do
case $opt in
a) echo "Option a" ;;
b) echo "Option b with $OPTARG" ;;
?) echo "Invalid option" ;;
esac
done
What is the problem if the script is run with -b but no argument?
medium
A. getopts will crash with syntax error
B. getopts will ignore -b and continue silently
C. getopts will treat -b as option without argument and print "Option b with"
D. getopts will set opt to '?' and print "Invalid option"
Solution
Step 1: Understand getopts behavior for missing argument
If an option that requires an argument (like b:) is given without one, getopts sets opt to '?' to indicate an error.
Step 2: Check case handling
The case statement has a '?' option that echoes "Invalid option". So the script will print that message.
Final Answer:
getopts will set opt to '?' and print "Invalid option" -> Option D
Quick Check:
Missing argument triggers '?' and error message [OK]
Hint: Missing argument triggers '?' option in getopts [OK]
Common Mistakes:
Assuming getopts crashes on missing argument
Thinking option is accepted without argument
Ignoring '?' case in script
5. You want to write a script that accepts options -f (file name) and -v (verbose flag). Which getopts string and case structure correctly handle these options, where -f requires an argument and -v does not?
Option -f requires an argument, so it must be followed by a colon: f:. Option -v is a flag, no colon needed. The correct string has ':' immediately after 'f', such as "vf:". Strings like "fv:" place ':' after 'v', making -v require an argument, which is wrong; missing ':' means no arguments expected.
Step 2: Match case statement to options
Case must handle v by setting verbose flag and f by assigning $OPTARG to file variable. getopts string: "vf:"; case: v) verbose=1 ;; f) file=$OPTARG ;; matches this correctly.