Monday, January 5, 2009

Positional Paramters at bash

The positional parameters or command line parameters are those which are passed as arguments to the script

eg: #myscript.sh arg1 arg2 arg3 arg4

Here arg1, arg2, arg3, and arg4 are positional or command line parameters. Now lets look at how these command line parameters can be used in the script. Bash keeps some internal variables in which the positional parameters are saved. They are as below

$0 Filename of script
$1 - $n Positional parameters #1 - #n
$# Number of positional parameters
"$*" All the positional parameters
"$@" All the positional parameters (why two of them ???)
${#*} Number of command-line parameters passed to script
${#@} Number of command-line parameters passed to script

Now let us see some examples using the positional parameters.

Check the script below


#!/bin/bash
if [[ $# != 11 ]]
then
echo "Usage `basename $0` arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 arg11"
exit 1
fi
echo -e "first argument is $1"
echo -e "second argument is $2"
echo -e "Third arguement is $3"
echo -e "Fourth argument is $4"
echo -e "Fifth argument is $5"
echo -e "Sixth argument is $6"
echo -e "Seventh argument is $7"
echo -e "Eighth argument is $8"
echo -e "Nineth argument is $9"
echo -e "Tenth argument is $10"
echo -e "Eleventh argument is $11"
echo -e "The complete list of arguments are $*"
echo -e "The complete list of arguments are $@"
echo -e "The number of command line parameters are ${#*}"
echo -e "The number of command line parameters are ${#@}"


Executing the above scripts gives the following output.

[sijo@CyBerJiNX bash]$ ./posparams.sh 1 2 3 4 5 6 7 8 9 10 11
first argument is 1
second argument is 2
Third arguement is 3
Fourth argument is 4
Fifth argument is 5
Sixth argument is 6
Seventh argument is 7
Eighth argument is 8
Nineth argument is 9
Tenth argument is 10
Eleventh argument is 11
The complete list of arguments are 1 2 3 4 5 6 7 8 9 10 11
The complete list of arguments are 1 2 3 4 5 6 7 8 9 10 11
The number of command line parameters are 11
The number of command line parameters are 11
[sijo@CyBerJiNX bash]$


Now rerun script as below.

[sijo@CyBerJiNX bash]$ ./posparams.sh one two three four five six seven eight nine ten eleven
first argument is one
second argument is two
Third arguement is three
Fourth argument is four
Fifth argument is five
Sixth argument is six
Seventh argument is seven
Eighth argument is eight
Nineth argument is nine
Tenth argument is one0
Eleventh argument is one1
The complete list of arguments are one two three four five six seven eight nine ten eleven
The complete list of arguments are one two three four five six seven eight nine ten eleven
The number of command line parameters are 11
The number of command line parameters are 11
[sijo@CyBerJiNX bash]$


See the way in which the tenth and eleventh argument is printed. Is this a bug.. No, so what is wrong with the script. Let us recheck the lines which prints tenth and eleventh args.

echo -e "Tenth argument is $10"
echo -e "Eleventh argument is $11"

The bash prints them as $1 followed by a 0 and $1 followed by a 1.So how to print the arguments $10 and $11. Rewrite the lines as

echo -e "Tenth argument is ${10}"
echo -e "Eleventh argument is ${11}"

The curly braces {} acts as the delimiter for the variable name to be printed. This is the right way in which any variables in a shell script should be printed.

Now check the lines

echo -e "The complete list of arguments are $*"
echo -e "The complete list of arguments are $@"

Are these lines one and the same?... No, they are not

The first line $* will store the entire command line parameters as a single string where as the second one $@ stores the elements in an array.


}}}