内部变量简介

shell中有很多内建变量,它们会影响到shell脚本的行为,所以也有必要知道。

*BASH:表示Bash的二进制程序文件的路径。

*BASH_ENV:它会指向一个Bash的启动文件,该文件会在一个脚本被调用时读取。

*BASH_SUBSHELL:用来提示子shell的层次。

*BASH_VERSINFO[n]:它包含了安装的Bash的版本信息,是一个含有6个元素的数组,分别代表:主版本号、次版本号、补丁次数、编译版本、发行状态和结构体系。

*BASH_VERSION:Bash的版本号,它与$BASH_VERSINFO很像,只是没那么详细。检查该变量对于判断系统上到底运行哪个shell来说是一种很好的办法,因为变量$SHELL有时候不能给出正确的答案。

*DIRSTACK:目录栈中最顶端的值。它与dirs命令类似,不过dirs命令会显示目录栈的整个内容。

*EDITOR:脚本默认的编辑器。

*EUID:表示“有效”的用户ID。

*FUNCNAME:当前函数的名字。只在函数中有效,超出函数作用域将变为null。

*GLOBIGNORE:在进行文件通配查找时要从结果集中去掉的文件模式组成的列表。

*GROUPS:当前用户所属的组ID列表。与/etc/passwd中的一样。

*HOME:用户的home目录,一般是/home/<username>。

*HOSTNAME:系统主机名。

*HOSTTYPE:主机类型。如同$MACHTYPE,用来识别系统硬件。

*IFS:内部域分隔符,用来决定Bash在解释字符串时如何识别域,或者单词边界。默认为空白符(空格、制表符和换行符)。示例如下:

$ v="aa:bb:cc"
$ IFS=":"
$ for a in $v; do echo "[$a]"; done
[aa]
[bb]
[cc]
$ IFS=
$ for a in $v; do echo "[$a]"; done
[aa:bb:cc]
$
$ bash -c 'set w x y-z; IFS=":"; echo "$* -> [$1] [$2] [$3]"'
w:x:y-z -> [w] [x] [y-z]

*IGNOREEOF:忽略EOF。告诉shell在logout之前要忽略多少次文件结束符(Ctrl+D)。

*LC_COLLATE:用来控制文件名扩展和模式匹配的展开顺序,常在~/.bashrc或/etc/profile中设置。文件名匹配在2.05版本后的Bash中不再区分中括号结构中的字符范围里字符的大小写,比如“ls[A-Z]*”既能匹配ABc也能匹配abc。要使中括号里的字符区分大小写,可以设置该变量为C。在/etc/profile和~/.bashrc中设置“exportLC_COLLATE=C”将永久生效。

*LC_CTYPE:控制通配和模式匹配中的字符串解释。

*LINENO:记录自身在脚本中所在的行号。一般用于调试目的。

*MACHTYPE:机器类型。标识系统的硬件。

*OLDPWD:之前的工作目录。

*OSTYPE:操作系统类型。

*PATH:可执行文件的搜索路径。

*PIPESTATUS:是一个数组变量,依次保存了运行在前台管道中的相应命令的退出状态码,即${PIPESTATUS[0]}保存管道中第一个命令的退出状态码,${PIPESTATUS[1]}保存第二个命令的退出状态码,依此类推。要注意的是,最后一个运行的管道的退出状态码和最后一个命令运行的退出状态码并不一定相同。

*PPID:父进程的进程ID。

*PROMPT_COMMAND:保存了在主提示符$PS1显示之前需要执行的命令。

*PS1:主提示符。可以在命令行中见到。

*PS2:第二提示符。当需要额外输入的时候就会看到,默认显示“>”。

*PS3:第三提示符。在一个select循环中显示。

*PS4:第四提示符。当使用“-x”选项来调用脚本时,该提示符就会出现在每行输出的开头。默认显示“+”。

*PWD:当前的工作目录。作用同内建命令“pwd”。

*RANDOM:这实际上是Bash的内部函数,它会产生0~32767之间的伪随机数。

*REPLY:当read命令没有指定接收输入的变量时,该变量就会作为默认变量提供给read。也可以用于select菜单,但是只提供所选择变量的编号,而不是变量本身的值。

*SECONDS:脚本已经运行的秒数。

*SHELLOPTS:shell中已经激活的选项的列表。这是一个只读变量。

*SHLVL:shell级别,就是Bash被嵌套的深度。如果是在命令行中,则其值为1。在脚本中则为2。

*TMOUT:表示在经过TMOUT秒后还没有输入,shell提示符将会超时。类似于read命令的“-t”参数。

*UID:当前的用户ID,是一个只读变量,和内建的id命令很像。

*$0,$1,$2等:位置参数。从命令行传递到脚本,或者传递给函数,或者set给变量(见上面的$IFS变量示例)。

*$#:命令行参数或者位置参数的个数。

*"$*":把所有的位置参数都看作为一个单词。使用时一般需要被引用起来,否则会把参数看成单独的单词。

*"$@":同“$*”,不过把参数列表中的每个参数都看作单独的单词,可迭代读取其中的每个参数。使用时一般也需要被引用起来。另外,shift命令执行后,“$@”将会保存剩余的位置参数,但是没有之前的“$1”,因为被shift丢弃了。“$@”和“$*”中的参数只有在被双引号引用起来的时候才会不同。“$IFS”变量的值也会影响这两个变量的行为,尤其是设置IFS为空的时候(IFS=""),不过这种行为可能依赖于所使用的shell。

*$-:使用set命令设置的脚本标记。

*$!:运行在后台的最后一个作业的进程ID。

*$_:保存之前执行的命令的最后一个参数或命令(没有参数的话)的值。

*$?:命令、函数,或脚本本身的退出状态码。

*$$:脚本自身的进程ID。经常用来构造“唯一的”临时文件名,因为比直接调用mktemp命令简单些。

相关推荐