Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Special variables ($0, $1, $#, $@, $?, $) in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Special variables ($0, $1, $#, $@, $?, $$)
Start Script
↓
Read $0: Script Name
↓
Read $1: First Argument
↓
Read $# : Number of Arguments
↓
Read $@ : All Arguments
↓
Execute Command
↓
Read $? : Last Command Exit Status
↓
Read $$ : Current Script PID
↓
End Script
The script starts by reading special variables: $0 for script name, $1 for first argument, $# for argument count, $@ for all arguments, $? for last command status, and $$ for script process ID.
Execution Sample
Bash Scripting
#!/bin/bash

# Example script

echo "Script name: $0"
echo "First arg: $1"
echo "Number of args: $#"
echo "All args: $@"
ls
echo "Last command exit status: $?"
echo "Script PID: $$"
This script prints special variables and runs 'ls' to show $? usage.
Execution Table
StepVariable/CommandValue/ActionOutput
1$0./example.shScript name: ./example.sh
2$1helloFirst arg: hello
3$#2Number of args: 2
4$@hello worldAll args: hello world
5lsruns ls commandLists files in current directory
6$?0Last command exit status: 0
7$$12345Script PID: 12345
💡 Script ends after printing all special variables and command output.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 5After Step 6Final
$0unset./example.sh./example.sh./example.sh./example.sh./example.sh./example.sh./example.sh
$1unsethellohellohellohellohellohellohello
$#unset2222222
$@unsethello worldhello worldhello worldhello worldhello worldhello worldhello world
$?unsetunsetunsetunsetunsetunset00
$$unset12345123451234512345123451234512345
Key Moments - 3 Insights
Why does $? show 0 after running ls?
Because $? holds the exit status of the last command. 'ls' succeeded, so $? is 0 as shown in step 6.
What does $@ show compared to $1?
$1 is only the first argument (step 2), but $@ shows all arguments separated by spaces (step 4).
Why is $$ useful?
$$ gives the current script's process ID, useful for creating unique temp files or tracking the script, as shown in step 7.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the value of $# at step 3?
A2
B1
C0
D3
💡 Hint
Check the 'Value/Action' column for step 3 in the execution_table.
At which step does the script run a command and capture its exit status?
AStep 4
BStep 6
CStep 5
DStep 7
💡 Hint
Look for the 'ls' command execution in the execution_table.
If the script was run without arguments, what would $1 and $# be?
A$1 is empty, $# is 1
B$1 is empty, $# is 0
C$1 is the script name, $# is 0
D$1 is the script name, $# is 1
💡 Hint
Refer to variable_tracker for how $1 and $# represent arguments.
Concept Snapshot
Special variables in bash:
$0 = script name
$1 = first argument
$# = number of arguments
$@ = all arguments
$? = last command exit status
$$ = current script PID
Use these to handle inputs and track script state.
Full Transcript
This lesson shows how bash special variables work. $0 holds the script name, $1 the first argument, $# the count of arguments, and $@ all arguments. The script runs a command 'ls' and $? captures its exit status. $$ shows the script's process ID. Watching these variables step-by-step helps understand how scripts get inputs and check command results.

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