Different parameters available in Linux Bash Shell with examples

In this post, we will look at the different parameters available in Linux Bash shell.

These parameters are very useful in preparation of shell scripts and in general shell operations.

Lets have a look at these parameters one by one with an example.

1. $0 gives the name of the shell or shell script.

### On shell, it returns the shell name.
user@ngelinux$ echo $0
-bash
user@ngelinux$ 

user@ngelinux$ cat example1.sh 
#!/bin/bash
echo "hello this is \$0 value: $0"

### In script, $0 return the script name.
user@ngelinux$ ./example1.sh 
hello this is $0 value: ./example1.sh

2. $1, $2, $3, … are the positional parameters.

### The script prints $1, $2 and $3 value.
user@ngelinux$ cat example2.sh 
#!/bin/bash
echo "the vlaues of 3 parameters passed are: $1 $2 $3"
user@ngelinux$ 

user@ngelinux$ ./example2.sh firstvar secondvar thirdvar
the vlaues of 3 parameters passed are: firstvar secondvar thirdvar
user@ngelinux$ 

3. $$ returns pid of the current shell (not subshell).

user@ngelinux$ echo $$
897

### We can see $$ is the current shell process ID.
user@ngelinux$ ps | grep 897
  897 ttys015    0:00.01 -bash

### In Shell script, it returns the script process ID generated, not the shell PID.
user@ngelinux$ cat bash.sh
#!/bin/bash
echo "Current shell script process id is $$"
user@ngelinux$

user@ngelinux$ ./bash.sh
Current shell script process id is 934

user@ngelinux$ ps | grep 934
  936 ttys015    0:00.00 grep 934

4. $? outputs the most recent foreground pipeline exit status.

### If command succeeds, the exit status returned is 0.
user@ngelinux$ echo "hello"; echo $?
hello
0

### if command failed the exit status returned is 1.
user@ngelinux$ df /dev/sdc; echo $?
df: /dev/sdc: No such file or directory
1
user@ngelinux$

5. $! is the Process ID of the most recent background command.

user@ngelinux$ tail -f file1 &
[1] 951

### Now $! will return the recent background Process ID.
user@ngelinux$ echo $!
951

### We can verify using ps command.
user@ngelinux$ ps -ef| grep -i 951
1447583   951   897   0 12:11PM ttys015    0:00.00 tail -f file1

6. $@ is an array-like construct of all positional parameters, {$1, $2, $3 …}.

user@ngelinux$ cat bash.sh
#!/bin/bash
echo "Passed parameters are $@"
user@ngelinux$

user@ngelinux$ ./bash.sh 1 2 3
Passed parameters are 1 2 3

7. $* is the IFS expansion of all positional parameters, $1 $2 $3 ….

user@ngelinux$ cat bash.sh
#!/bin/bash
echo "Passed parameters are $@"
echo "Passed parameters are $*"
user@ngelinux$

user@ngelinux$ ./bash.sh 1 2 3 5353
Passed parameters are 1 2 3 5353
Passed parameters are 1 2 3 5353

Here we can see the output of $# and $* are same. Since both outputs the same positional parameters $1 $2 $3.
The difference is that $@ outputs “$1” “$2”, and $* outputs “$1 $2”.

8. $# is the number of positional parameters.

user@ngelinux$ cat bash.sh
#!/bin/bash
echo "Passed parameters are $@"
echo "Passed parameters are $#"
user@ngelinux$

user@ngelinux$ ./bash.sh
Passed parameters are
Passed parameters are 0

user@ngelinux$ ./bash.sh 9 5
Passed parameters are 9 5
Passed parameters are 2

9. $- current options set for the shell.

 user@ngelinux$ echo $-
himBH

Here himBH are the shell options which denotes: h means remember the location of commands, i is for interactive output, m for monitor mode, B is for brace expansion, and H is to enable history command expansion that starts from !.

10. $_ most recent parameter (or the abs path of the command to start the current shell immediately after startup).
$IFS is the (input) field separator.

user@ngelinux$ echo hello hello2; echo $_
hello hello2
hello2

Leave a Reply

Your email address will not be published.