How do I find the number of arguments passed to a Bash script?
This is what I have currently:
#!/bin/bash
i=0
for var in "$@"
do
i=i+1
done
Are there other (better) ways of doing this?
The number of arguments is $#
Search for it on this page to learn more.
argc
in C-like languages, $#
will be 0
if there are no arguments passed to the script, 1
if there is one argument, etc.
Commented
Dec 8, 2014 at 11:55
shift
arguments away from its array, $#
will also be deducted by 1. It will always represent the length of $@
which is quite handy.
Commented
Nov 26, 2021 at 22:42
#!/bin/bash
echo "The number of arguments is: $#"
a=${@}
echo "The total length of all arguments is: ${#a}: "
count=0
for var in "$@"
do
echo "The length of argument '$var' is: ${#var}"
(( count++ ))
(( accum += ${#var} ))
done
echo "The counted number of arguments is: $count"
echo "The accumulated length of all arguments is: $accum"
bc
, or something else (ksh93 and zsh can also do decimal math). Your code includes dollar signs for some variables, but not others. You should be consistent about using them or not. Inside (())
they're not necessary. They are, however, in the echo
statements.
Commented
Mar 4, 2016 at 17:47
to add the original reference:
You can get the number of arguments from the special parameter $#
. Value of 0 means "no arguments". $#
is read-only.
When used in conjunction with shift
for argument processing, the special parameter $#
is decremented each time Bash Builtin shift
is executed.
see Bash Reference Manual in section 3.4.2 Special Parameters:
"The shell treats several parameters specially. These parameters may only be referenced"
and in this section for keyword $# "Expands to the number of positional parameters in decimal."
Below is the easy one -
cat countvariable.sh
echo "$@" | awk '{print NF}'
Output :
#./countvariable.sh 1 2 3 4 5 6
6
#./countvariable.sh 1 2 3 4 5 6 apple orange
8
i+1
in the variablei
if any arguments are present.