4

$是什么意思!在 shell 或 shell 脚本中?我正在尝试理解具有以下内容的脚本。

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

它正在打印变量。都是为了这个吗?我们还有哪些其他 $x 选项?我知道的很少有 $$、$*、$?。如果有人能给我指出一个好的来源,那将会很有帮助。顺便说一句,这是在 Sun OS 5.8,KSH 中。

4

5 回答 5

6
于 2009-11-04T10:38:52.113 回答
2

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.
于 2009-11-04T10:38:17.853 回答
1

对于您要询问的 shell,ksh,请使用ksh 手册,并阅读以下内容:

参数替换
参数是一个标识符、一个或多个数字或任何字符 *、@、#、?、-、$ 和 !。

很明显,这些是可接受的选项 $*、$@、$#、$?、$-、$$ 和 $!。
未来可能会包括更多。


对于参数 $!,来自手册:

“!” 最后调用的后台命令的进程号。

如果你启动一个后台进程,比如sleep 60 &,那么这个进程会有一个进程号,以及参数 $! 将打印其编号。

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

如果执行中没有后台进程(如 shell 启动时),则扩展为空。它有一个空值。

$ ksh -c 'echo $!'

如果有后台进程,则扩展为该进程的PID:

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

这就是为什么echo $!a扩展到a. 这是因为没有要报告的PID:

$  ksh -c 'echo $!a'
a

其他 shell 可能有不同(通常非常相似)的扩展列表(一个只有一个 $ 和一个下一个字符的参数)。
例如,bash 将其识别*@#?-$!0_为“特殊参数”。在 Bash 手册中搜索标题“3.​​4.2 特殊参数”。

特殊参数
shell 对几个参数进行了特殊处理。

于 2015-10-30T14:14:09.437 回答
0

!是 unix 中的引用运算符,尽管它不是用那个名称调用的。

它总是指一个母进程。尝试输入:!在 vi 中,它会将您带到命令提示符,您可以像往常一样执行命令,直到退出命令。

!在 SQLPLUS 中也从命令提示符执行命令。在 sqlplus 中试试这个

SQL> !ls --- 这给出了当前目录中的文件列表。

美元!- 显然给出了当前/最新进程的进程 ID。

于 2009-12-13T08:37:11.193 回答
0

它给出了最后一个后台作业或后台函数的进程 ID 请通过下面的这个链接

http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar
于 2009-12-07T11:14:36.037 回答