How To Use Command Line Arguments in Bash Scripts

How To Use Command Line Arguments in Bash Scripts

Bash scripts, a crucial tool in the arsenal of any programmer, are especially essential for those working in Unix/Linux environments. These scripts serve as the backbone for automation tasks, file management, and a plethora of other functionalities. One of the most potent features of Bash scripts that significantly enhances their utility is the ability to accept command line arguments. Command line arguments bring an element of flexibility and customization that is unmatched. This blog post aims to serve as an in-depth exploration of command line arguments in Bash scripts, arming you with the knowledge needed to fully exploit their capabilities.

Understanding Command Line Arguments

Before we delve into the practical aspects of using command line arguments in Bash scripts, it's crucial that we establish a clear understanding of what command line arguments are. In the simplest of terms, these arguments are additional pieces of information that you provide alongside a script or a program's instruction to run. This additional information serves to guide the execution of the script or program, often modifying its behavior in specific ways.

Consider, for example, the ls command in Unix/Linux. This command, when run, lists the contents of a directory. In its basic form, running ls will display the contents of the current directory. However, the inclusion of command line arguments can modify its functionality. If you were to run ls -l, the -l functions as a command line argument. This argument instructs ls to display the directory contents in a long listing format, providing additional details such as file permissions, number of links, owner, group, size, and time of last modification.

Accessing Command Line Arguments in Bash Scripts

In the context of a Bash script, there are a number of special variables that you can utilize to access command line arguments:

  • $0 – This variable contains the name of the Bash script. It is particularly useful in situations where you may need to print out the script's name or utilize it in some other way within the script itself.
  • $1 to $9 – These variables are used to contain the first 9 additional arguments that are passed to the script. Each variable corresponds to the argument's position, i.e., $1 contains the first argument, $2 the second, and so on.
  • $# – This variable is used to contain the total number of additional arguments that have been passed to the script. It can be used to control script behavior depending on the number of arguments.
  • $@ and $* – These variables hold all additional arguments that have been passed to the script. They are useful in scenarios where you need to operate on or display all arguments.

To illustrate these concepts, let's create a simple script. This script will print out the name of the script, the first two arguments, all arguments using both $* and $@, and the total number of arguments.

#!/bin/bash # script: echo "Script Name: $0" echo "First Argument: $1" echo "Second Argument: $2" echo "All Arguments with \$*: $*" echo "All Arguments with \$@: $@" echo "Total Number of Arguments: $#"

You can run the script with command line arguments like so:

bash arg1 arg2 arg3

Difference between $* and $@

At first glance, $* and $@ appear to serve the same purpose. However, there is a subtle but significant difference between the two. When quoted, $* will combine all arguments into a single string, using the first character of the IFS (Internal Field Separator) environment variable as a separator. Conversely, "$@" treats each argument as a separate quoted string.

This difference can be better understood through a modification of our script:

#!/bin/bash # script: echo "All Arguments with \$*: $*" echo "All Arguments with \"\$*\": \"$*\"" echo "All Arguments with \$@: $@" echo "All Arguments with \"\$@\": \"$@\""

Running the script with multiple arguments will yield different results for "$*" and "$@", thereby highlighting their difference.

Shifting Command Line Arguments

Bash provides a shift command that allows you to 'shift' command line arguments to the left. When you execute shift n, the positional parameters from n+1 are renamed to $1, $2, and so on. This can be particularly useful when you need to process more than nine command line arguments.

Consider the following script:

#!/bin/bash # script: echo "Before shift: $1 $2 $3" shift echo "After shift: $1 $2 $3"

Running this script with three arguments will demonstrate how the arguments shift after the shift command is executed.


Q: Can Bash scripts accept more than nine command line arguments?

Yes, Bash scripts can accept more than nine command line arguments. While there are only nine dedicated variables for the first nine arguments ($1 to $9), additional arguments can be accessed using the shift command or the $@ or $* variables.

Q: What is the difference between $@ and $*?

Both $@ and $* are used to hold all command line arguments. However, when quoted, their behavior differs. "$@" treats each argument as a separate quoted string, while "$*" combines all arguments into a single string.

Q: How can I handle an unknown number of command line arguments in a Bash script?

An unknown number of command line arguments can be handled using a for loop with $@ or $*. This allows the script to iterate over each argument, regardless of the total number.


Command line arguments are a powerful tool that can greatly enhance the flexibility of your Bash scripts. They allow you to pass additional information to your script at runtime, enabling different behaviors based on the inputs provided. By understanding how to effectively use command line arguments, you can write more complex and dynamic Bash scripts.

For more information on Bash scripting and command line arguments, I highly recommend referring to the official Bash documentation. It provides a comprehensive and detailed guide to Bash, covering everything from basic syntax to advanced features.


I hope this blog post helps you understand the use of command line arguments in Bash scripts better. Practice is key when it comes to coding, so make sure to try out these examples and experiment with different scenarios. Happy coding to the codedamn community!

Sharing is caring

Did you like what Sarthak Jain wrote? Thank them for their work by sharing it on social media.


No comments so far