$是什么意思!在 shell 或 shell 脚本中?我正在尝试理解具有以下内容的脚本。
local@usr> a=1
local@usr> echo $a
1
local@usr> echo $!a
a
它正在打印变量。都是为了这个吗?我们还有哪些其他 $x 选项?我知道的很少有 $$、$*、$?。如果有人能给我指出一个好的来源,那将会很有帮助。顺便说一句,这是在 Sun OS 5.8,KSH 中。
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.
对于您要询问的 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 对几个参数进行了特殊处理。
!是 unix 中的引用运算符,尽管它不是用那个名称调用的。
它总是指一个母进程。尝试输入:!在 vi 中,它会将您带到命令提示符,您可以像往常一样执行命令,直到退出命令。
!在 SQLPLUS 中也从命令提示符执行命令。在 sqlplus 中试试这个
SQL> !ls --- 这给出了当前目录中的文件列表。
美元!- 显然给出了当前/最新进程的进程 ID。
它给出了最后一个后台作业或后台函数的进程 ID 请通过下面的这个链接
http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#specvar