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?
Command line arguments are visible in the shell script from
$0 is always the path to the shell script the way it was called:
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
The special variable
$@ contains all arguments passed to the script, excluding
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.
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