Question

What is the meaning for $! in shell or shell scripting? I am trying to understand a script which has the something like the following.

local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a

It is printing the variable back. Is it all for that? What are the other $x options we have? Few I know are $$, $*, $?. If anyone can point me to a good source, it will be helpful. BTW, This is in Sun OS 5.8, KSH.

Was it helpful?

Solution

The various $… variables are described in Bash manual. According to the manual $! expands to the PID of the last process launched in background. See:

$ echo "Foo"
Foo
$ echo $!

$ true&
[1] 67064
$ echo $!
67064
[1]+  Done                    true

In ksh it seems to do the same.

OTHER TIPS

From the ksh man page on my system:

  ${!vname}
      Expands  to the name of the variable referred to by vname.  This
      will be vname except when vname is a name reference.

For the shell you are asking, ksh, use the the ksh manual, and read this:

Parameter Substitution
A parameter is an identifier, one or more digits, or any of the characters *, @, #, ?, -, $, and !.

It is clear that those are the accepted options $*, $@, $#, $?, $-, $$, and $!.
More could be included in the future.


For the parameter $!, from the manual:

"!" The process number of the last background command invoked.

if you start a background process, like sleep 60 &, then there will be a process number for such process, and the parameter $! will print its number.

$ sleep 60 &
[1] 12329
$ echo "$!"
12329

If there is no background process in execution (as when the shell starts), the exansion is empty. It has a null value.

$ ksh -c 'echo $!'

If there is a background process, it will expand to the PID of such process:

$  ksh -c 'sleep 30 & echo $!'
42586

That is why echo $!a expanded to a. It is because there is no PID to report:

$  ksh -c 'echo $!a'
a

Other shells may have a different (usually pretty similar) list of expansions (a parameter with only one $ and one next character).
For example, bash recognize this *@#?-$!0_ as "Special parameters". Search the Bash manual for the heading "3.4.2 Special Parameters".

Special Parameters
The shell treats several parameters specially.

It gives the Process id of last backgroundjob or background function Please go through this link below

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar

! is a reference operator in unix, though it is not called with that name.

It always refers to a mother process. Try typing :! in vi, it takes you to command prompt and you can execute commands as usual until exit command.

! in SQLPLUS also executes the command from the command prompt. try this in sqlplus

SQL> !ls --- this gives the list of files inthe current dir.

$! - obviously gives the process id of the current/latest process.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top