• $1, $2, $3, … are the positional parameters. e.g.
# cat ./script.sh
echo first param: $1
echo second param: $2
echo third param: $3

# bash ./script.sh a b c
# first param: a
# second param: b
# third param: c
  • $@: an array-like construct of all positional parameters, {$1, $2, $3, …}. e.g.
# cat ./script.sh
echo $@
    
# bash ./script.sh a b c
# a b c
  • $* is the IFS (Internal Field Separator) expansion of all positional parameters, $1, $2, $3, …. It looks similar to but is still different from $@ depending on the special shell variable $IFS and whether $* is double quoted or not. See here for more details. e.g.
# cat ./script.sh
echo $*
echo "$*"
IFS='|'
echo $*
echo "$*"
IFS='#'
echo "$*"

# bash ./script.sh a b c
# a b c
# a b c
# a b c
# a|b|c
# a#b#c
  • $# is the number of positional parameters. e.g.
# cat ./script.sh
echo $#

# bash ./script.sh a b c
# 3
  • $- current options set for the shell. See this post for some common shell options available, and this post for more details on $-. e.g.
# cat ./script.sh
set -e
echo $-

# bash ./script.sh
# eHb
# Hb appears to be default.
  • $$ pid of the current shell (not subshell)
# cat ./script.sh
echo $$

# bash ./script.sh
# 71061
# can be some other number, as well.
  • $_ most recent parameter (or the absolute path of the command to start the current shell immediately after startup)
# cat ./script.sh
echo $_

# ls -l
# bash ./script.sh
# -l
# because -l is the most recent parameter used, I don't know why this is useful?!
  • $IFS the (input) field separator, see how it’s used together with $* as described above

  • $? most recent foreground pipeline exit status.

  • $! PID of the most recent background command

  • $0 name of the shell or shell script

# cat this_awesome_script.sh
echo $0

# $bash this_awesome_script.sh
# this_awesome_script.sh

Reference: http://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables