📖 Scenario: You are creating a simple bash script that accepts long options from the command line. This is common when you want your script to be user-friendly and clear, like many Linux commands.Imagine you want to make a script that accepts options like --name and --age to greet a user with their name and age.
🎯 Goal: Build a bash script that parses two long options --name and --age from the command line and prints a greeting message using those values.
📋 What You'll Learn
Create variables to hold the name and age
Use a while loop with a case statement to parse --name and --age options
Assign the values passed to these options to the variables
Print a greeting message using the parsed values
💡 Why This Matters
🌍 Real World
Parsing command line options is essential for making scripts user-friendly and flexible, just like many Linux commands you use daily.
💼 Career
Understanding how to parse options in bash scripts is a key skill for system administrators, DevOps engineers, and anyone automating tasks on Linux servers.
Progress0 / 4 steps
1
Create variables to hold 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 a while loop to parse command line arguments
Add a while loop that runs while [[ $# -gt 0 ]] to process all command line arguments. Inside the loop, use a case statement on $1 to check for --name and --age options.
Bash Scripting
Hint
Use while [[ $# -gt 0 ]] and case "$1" in to check options.
3
Assign values to name and age inside the case
Inside the case statement, for --name assign the next argument $2 to name and shift twice. For --age, assign $2 to age and shift twice.
Bash Scripting
Hint
Use name="$2" and shift 2 to assign and move to next arguments.
4
Print the greeting message using parsed name and age
Add a echo statement after the loop to print: Hello, NAME! You are AGE years old. replacing NAME and AGE with the variables name and age.
Bash Scripting
Hint
Use echo "Hello, $name! You are $age years old." to print the message.
Practice
(1/5)
1. What is the main advantage of using long option parsing in bash scripts?
easy
A. It makes scripts easier to use with clear option names
B. It speeds up script execution significantly
C. It reduces the number of lines in the script
D. It automatically fixes syntax errors in scripts
Solution
Step 1: Understand the purpose of long options
Long options use descriptive names like --help instead of short flags like -h, making scripts easier to understand.
Step 2: Compare benefits
While long options improve clarity, they do not inherently speed up execution or reduce code length, nor fix syntax errors automatically.
Final Answer:
It makes scripts easier to use with clear option names -> Option A
Quick Check:
Long options improve clarity = D [OK]
Hint: Long options are about clarity, not speed or length [OK]
Common Mistakes:
Confusing long options with performance improvements
Thinking long options reduce script size
Assuming long options fix syntax errors automatically
2. Which of the following is the correct syntax to start parsing long options in a bash script?
easy
A. if [ "$1" == "--help" ]; then echo help; fi
B. while [[ "$1" == --* ]]; do case "$1" in ... ;; esac; shift; done
C. for arg in $@; do if [[ $arg == -* ]]; then ... fi; done
D. while getopts "h" opt; do case $opt in ... ;; esac; done
Solution
Step 1: Identify long option parsing pattern
Long options start with --, so checking if $1 starts with -- in a while loop is correct.
Step 2: Analyze options
while [[ "$1" == --* ]]; do case "$1" in ... ;; esac; shift; done uses while [[ "$1" == --* ]] and case to parse options, which is standard for long options. for arg in $@; do if [[ $arg == -* ]]; then ... fi; done checks short options, A is a single if, and D uses getopts which doesn't support long options.
Final Answer:
while [[ "$1" == --* ]]; do case "$1" in ... ;; esac; shift; done -> Option B
Quick Check:
Long option parsing uses while + case + --* check = C [OK]
Hint: Long options start with --, use while and case to parse [OK]
Common Mistakes:
Using getopts which only supports short options
Checking only single dash options
Not shifting arguments after processing
3. Given this snippet, what will be the output if the script is run with --name=John?
while [[ "$1" == --* ]]; do
case "$1" in
--name=*)
name="${1#*=}"
;;
--help)
echo "Help requested"
exit 0
;;
esac
shift
done
echo "Name is $name"
medium
A. Name is
B. Name is --name=John
C. Help requested
D. Name is John
Solution
Step 1: Understand parameter expansion
The pattern --name=* matches --name=John. The expression ${1#*=} removes everything up to and including the first '=' sign, extracting 'John'.
Step 2: Follow script flow
The script assigns 'John' to variable name, shifts arguments, then prints "Name is $name".
Final Answer:
Name is John -> Option D
Quick Check:
Parameter expansion extracts value = A [OK]
Hint: Use ${var#*=} to get value after '=' in long options [OK]
Common Mistakes:
Printing the whole argument instead of value after '='
Confusing option with its value
Not shifting arguments causing infinite loop
4. What is wrong with this long option parsing snippet?
while [[ "$1" == --* ]]; do
case "$1" in
--file)
file="$2"
shift
;;
--help)
echo "Help"
exit 0
;;
esac
shift
done
medium
A. It should not shift twice in the loop
B. It uses single brackets instead of double brackets
C. It does not check if $2 exists before using it
D. It should use getopts for long options
Solution
Step 1: Analyze argument usage
The script assigns file="$2" without checking if $2 exists, which can cause errors if no value is provided.
Step 2: Review other options
Using double brackets is valid, shifting twice is correct here (once after reading value, once at loop end), and getopts does not support long options well.
Final Answer:
It does not check if $2 exists before using it -> Option C
Quick Check:
Missing check for $2 causes errors = A [OK]
Hint: Always verify next argument exists before using it [OK]
Common Mistakes:
Not checking if option value is missing
Confusing shift usage causing argument skipping
Trying to parse long options with getopts
5. You want to parse long options --user and --password where values can be given as --user=alice or --user alice. Which approach correctly handles both forms in bash?
hard
A. Use case with patterns --user=* and --user, assign value from ${1#*=} or $2 accordingly, shift once or twice
B. Use getopts with "user:" and "password:" options
C. Only accept --user=alice form and reject space-separated values
D. Parse all arguments with a for loop and split on '=' manually
Solution
Step 1: Understand option forms
Long options can be given as --user=alice or --user alice. The script must handle both.
Step 2: Implement parsing logic
Use case with --user=* to get value from ${1#*=}, and --user to get value from next argument $2. Shift accordingly to consume arguments.
Step 3: Evaluate other options
Getopts does not support long options, rejecting space-separated values reduces usability, and manual splitting in a for loop is error-prone.
Final Answer:
Use case with patterns --user=* and --user, assign value from ${1#*=} or $2 accordingly, shift once or twice -> Option A
Quick Check:
Handle both forms with case and shifts = B [OK]
Hint: Match both --option=* and --option, shift args properly [OK]
Common Mistakes:
Using getopts which lacks long option support
Ignoring space-separated values
Not shifting arguments correctly causing errors
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.