Bird
Raised Fist0
Bash Scriptingscripting~5 mins

Special variables ($0, $1, $#, $@, $?, $) in Bash Scripting - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Special variables ($0, $1, $#, $@, $?, $$)
O(n)
Understanding Time Complexity

We want to understand how the use of special variables in a bash script affects how long the script takes to run.

Specifically, we ask: how does the script's running time grow as the number of input arguments changes?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

#!/bin/bash

# Print script name
 echo "Script name: $0"

# Print first argument
 echo "First argument: $1"

# Print number of arguments
 echo "Number of arguments: $#"

# Print all arguments
 for arg in "$@"; do
   echo "Arg: $arg"
 done

# Print last command exit status
 echo "Last command status: $?"

# Print current process ID
 echo "Process ID: $$"

This script prints special variables: script name, arguments, count, all arguments, last command status, and process ID.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The for loop that goes through all input arguments using $@.
  • How many times: It runs once for each argument passed to the script, so as many times as the number of arguments.
How Execution Grows With Input

As the number of input arguments grows, the loop runs more times, printing each argument.

Input Size (n)Approx. Operations
10About 10 loop prints
100About 100 loop prints
1000About 1000 loop prints

Pattern observation: The number of operations grows directly with the number of arguments.

Final Time Complexity

Time Complexity: O(n)

This means the script takes longer roughly in direct proportion to how many arguments it receives.

Common Mistake

[X] Wrong: "Using special variables like $@ or $# does not affect how long the script runs."

[OK] Correct: The loop over $@ runs once per argument, so more arguments mean more work and longer run time.

Interview Connect

Understanding how loops over input arguments affect script speed shows you can reason about script efficiency and handle inputs well.

Self-Check

"What if we replaced the for loop over $@ with a single print of all arguments at once? How would the time complexity change?"

Practice

(1/5)
1. In a bash script, what does the special variable $# represent?
easy
A. The exit status of the last command
B. The name of the script
C. The number of arguments passed to the script
D. The process ID of the script

Solution

  1. Step 1: Understand the role of $#

    The variable $# in bash holds the count of all arguments passed to the script.
  2. Step 2: Differentiate from other special variables

    $0 is the script name, $$ is the process ID, and $? is the last command's exit status, so they don't represent argument count.
  3. Final Answer:

    The number of arguments passed to the script -> Option C
  4. Quick Check:

    $# = argument count [OK]
Hint: Remember: '#' means count, so $# counts arguments [OK]
Common Mistakes:
  • Confusing $# with $@ which holds all arguments
  • Thinking $0 is the argument count
  • Mixing up $? with argument count
2. Which of the following is the correct way to print the first argument passed to a bash script?
easy
A. echo $1
B. echo $0
C. echo $#
D. echo $$

Solution

  1. Step 1: Identify the variable for the first argument

    $1 holds the first argument passed to the script.
  2. Step 2: Check other options

    $0 is the script name, $# is the argument count, and $$ is the script's process ID, so they are incorrect for printing the first argument.
  3. Final Answer:

    echo $1 -> Option A
  4. Quick Check:

    First argument = $1 [OK]
Hint: Use $1 to access the first argument in bash scripts [OK]
Common Mistakes:
  • Using $0 instead of $1 for first argument
  • Confusing $# with argument value
  • Trying to print $$ for argument
3. Consider the script ./myscript.sh apple banana with this content:
echo "$0"
echo "$1"
echo "$#"
echo "$@"
echo "$$"

What will be the output of the third line echo "$#"?
medium
A. myscript.sh
B. 3
C. apple
D. 2

Solution

  1. Step 1: Count the arguments passed

    The script is called with two arguments: 'apple' and 'banana'. So, the count is 2.
  2. Step 2: Understand what $# prints

    $# prints the number of arguments, which is 2 here.
  3. Final Answer:

    2 -> Option D
  4. Quick Check:

    Arguments count = 2 [OK]
Hint: Count arguments after script name for $# [OK]
Common Mistakes:
  • Counting script name as argument
  • Confusing $@ with $#
  • Expecting argument values instead of count
4. You wrote this script snippet:
echo "Last command status: $?"
ls /nonexistent

But it always prints Last command status: 0 even if the directory doesn't exist. What is the problem?
medium
A. The ls command is correct, no problem
B. The echo runs before ls, so $? is from previous command
C. You should use $$ instead of $?
D. You need to quote $? differently

Solution

  1. Step 1: Understand when $? is evaluated

    $? holds the exit status of the last command executed before it.
  2. Step 2: Check command order

    The echo runs first, so it shows the status of the command before echo, not ls.
  3. Final Answer:

    The echo runs before ls, so $? is from previous command -> Option B
  4. Quick Check:

    Check command order for $? [OK]
Hint: Print $? immediately after the command to get correct status [OK]
Common Mistakes:
  • Using $$ instead of $? for exit status
  • Printing $? before running the command
  • Assuming $? holds script PID
5. You want to write a bash script that prints its own process ID and all arguments passed to it on separate lines. Which script snippet correctly does this?
hard
A. echo "PID: $$" echo "Args: $@"
B. echo "PID: $0" echo "Args: $#"
C. echo "PID: $?" echo "Args: $1"
D. echo "PID: $1" echo "Args: $$"

Solution

  1. Step 1: Identify variable for process ID

    $$ holds the current script's process ID.
  2. Step 2: Identify variable for all arguments

    $@ holds all arguments passed to the script as separate words.
  3. Final Answer:

    echo "PID: $$" echo "Args: $@" -> Option A
  4. Quick Check:

    PID = $$, all args = $@ [OK]
Hint: Use $$ for PID and $@ for all arguments [OK]
Common Mistakes:
  • Using $0 as PID instead of $$
  • Using $# (count) instead of $@ (all args)
  • Mixing $1 (first arg) with PID
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard