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→$0contains./script.sh -
path/to/script.sh→$0containspath/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
Top comments (0)