DEV Community 👩‍💻👨‍💻

Tenry
Tenry

Posted on

Bash arguments

When executing a shell script, you can pass any number of arguments. Let's say, you invoke a bash script like this: ./script.sh "foo bar" baz"
What does the shell script see?

Variables

Command line arguments are visible in the shell script from $0 to $9, where $0 is always the path to the shell script the way it was called:

  • ./script.sh$0 contains ./script.sh
  • path/to/script.sh$0 contains path/to/script.sh

In other words, this is the path to the script relative to the working directory or an absolute path.

In the example in the introduction of this article, $1 would contain foo bar and $2 baz.

The special variable $@ contains all arguments passed to the script, excluding $0.

Passing arguments to another script

Let's say, we have script1.sh, which calls script2.sh and passes all arguments over. In script1.sh, you pass $@ to script2.sh. But note there's a significant difference if the argument is quoted or not:

If you do ./script1.sh "foo bar" baz and that script does ./script2.sh $@, it would be substituted to ./script2.sh foo bar baz. While we originally only passed 2 arguments to script1.sh, script2.sh would receive 3 arguments.

If the first script would instead quote the argument, ./script2.sh "$@", it would be substituted to ./script2.sh "foo bar" baz.

Looping over arguments

The following example shows how to loop over all arguments passed to a shell script:

#!/usr/bin/env bash

for arg in "$@"
do
  if [ "$arg" == "--help" ] || [ "$arg" == "-h" ]
  then
    echo "Help argument detected."
  fi
done
Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Dream Big


Use any Linode offering to create something unique or silly in the DEV x Linode Hackathon 2022 and win the Wacky Wildcard category.

Join the Hackathon <-